如何实现一个c/s模式的flv视频点播系统
一、写在前面
视频点播,是一个曾经很热,现如今依然很热的一项视频服务技术。本人最近致力于研究将各种视频格式应用于点播系统中,现已研究成功FLV, F4V, MP4, TS格式的视频点播解决方案,完全支持以上格式中存放H.264编码视频的情况,并将继续研究其他格式。
这里有一点需要说明的是,F4V本来指的是Adobe基于ISO/IEC 14496-12标准推出来的视频格式,与MP4格式相同,但因为国内许多的视频网站,均把存放H.264编码视频的FLV文件标注为.f4v格式,而这种文件的点播实现方式和普通的FLV是有所不同的,所以,为了避免更加混淆,我沿用了它们的命名方式,因此,“FLV”将仅指不包含H.264/AAC编码的一般FLV视频。
本文简单介绍如何实现一个简单的基于flv的视频点播系统。
二、FLV格式
FLV(Flash Video)是Adobe公司推出的视频格式,是一种专门用来在网络上传输的视频存储容器格式。其格式相对简单,不需要很大的媒体头部信息,因此加载速度极快。国内各大视频网站,均有采用FLV格式作为其点播、甚至直播的视频格式。FLV容器格式的主要特点是tag,整个FLV由Video Tag, Audio Tag以及其他Tag组成,没有映射表。
基本上,可以把FLV格式简要画为如下形式:
其中,FLV Header指的是FLV的头部,只有9个字节,和常规的MP4文件头部相比,这个小太多了。FLV MetaData存放的是一些整个视频文件的媒体信息,包括作者、视频宽高、时长、关键帧列表等等,这些信息对于解析视频文件来说,当然很重要,不过可惜的是,因为FLV的MetaData是可有可无的,所以有不少FLV没有MetaData,而且即便有,其MetaData中的信息也是不正确的,这导致MetaData非常不值得信赖。所以,在解析FLV的时候,应该直接忽略FLV MetaData部分,通过遍历FLV的所有Tag,来获取相应的媒体信息。
三、方案
点播系统的实现,有几个关键点,最重要的应该是“播放网络流”和“拖动”这两点。其中,关于“拖动”,由于整个系统是基于网络的,客户端在拖动之后,必须重新向服务器端发送请求,服务器根据客户端的拖动请求,寻找最接近的拖动点,返回可以播放的数据流,从而完成点播拖动。
对于FLV来说,因为其格式简单,头部非常小,而MetaData可以不要,所以只需要寻找到关键帧,然后拼上FLV Header,就可以组成一个可播放的视频文件。如下图所示:
根据FLV格式的特点,以及拖动后生成新的可播放文件的方法,可以将flv点播系统设计成如下方案:
1. 服务器端
首先,解析flv文件,生成flv视频关键帧列表,表明时间和便宜量的对应关系。然后,当接收到客户端发来的数据请求时,根据客户端拖动的时间点的请求,找出时间距离最近的关键帧,根据偏移量,读取flv的文件数据,然后拼接flv的9字节文件头部(还需要再加上4个字节全零的pre tag size,共13字节),返回。
2. 客户端
客户端需要特别注意的,除了正确的解析视频流并播放,还需要小心时间轴的行进,因为用户拖动的时间位置并不一定是关键帧,所以,需要根据服务器返回的关键帧的真实时间,重新定位播放进度。
四、实现
服务器可以实现为一个http server,只需要提供http下载,在响应下载之前,需要完成之前所描述的逻辑。可以完全自己实现,可以直接使用现有的成熟web server,如果对性能要求很高,强烈推荐nginx,借助于nginx强大的处理性能,通过实现自己的nginx module,可以完成你所有的需求。
客户端播放器,对于不太熟悉播放器开发技术的,可基于libvlc,借助于vlc良好的网络播放能力,基本可以满足需要。
下面是前些日子做的一个演示程序,
------------------------------------------------------------
转载请注明作者和出处,谢谢~
相关文章
- linux系统安装mysql
- Midletinfo-探索手机javaME系统信息的实用工具
- 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨(转)
- jmeter全面总结-6-jmeter性能数据监控系统 influxdb,grafana
- 基于EasyDSS流媒体解决方案创建视频点播、短视频、视频资源库等视频播放系统
- 内网域安全入侵感知系统watchAD
- 安装win7或win8系统时UEFI和Legacy模式的设置
- 使用Java connector消费ABAP系统的函数
- Atitit 三种并发编程模型 艾龙 attilax总结 1. 并发系统可以使用不同的并发模型去实现。1 2. 并行工作者 并行工作者模型。进来的任务分配给不同的工作者 银行模式2 2.1.
- atitit.userService 用户系统设计 v4 q316 .doc
- ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值
- Android 11.0 系统Settings去掉开发者模式功能
- Android 11.0 12.0系统添加水印(仿安全模式水印)
- 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计
- Android 4.3 系统裁剪——删除不使用的app及添加自己app
- Android系统默认Home应用程序(Launcher)的启动过程源码分析
- eHR系统和OA系统有什么不同?
- OA办公系统:颠覆企业办公模式,激活组织潜能打造新模式
- Win11系统电脑节电模式如何打开
- Win10系统无法正常关闭护眼模式怎么办?
- 【Deepin 20系统】错误挂载进入initramfs模式不能正常进入系统
- Android 11.0 系统开启和关闭黑白模式主题功能实现
- Android 10.0 系统systemui下拉通知栏的通知布局相关源码分析