现在的位置: 首页 > 综合 > 正文

关于视频相关的播放、转换技术总结

2013年12月08日 ⁄ 综合 ⁄ 共 1540字 ⁄ 字号 评论关闭

1、关于播放器。

主流播放器除之前的功能之外,新增了不少功能点,增加了技术的复杂度。

主要功能有:分段加载,拖动。 需要支持的技术。1、分段切换视频,2、获取视频总长度、大小。分段长度、大小。3.最关键的需要找到关键帧(I帧),4进度条的整合管理

实现效果:用户观看影片时,首先加载第一段,用户观看,第一段加载完成,观看到到第一段的百分之N(可以是50%-80%)的时候,后台自动加载第二段。第二段加载完成后,若第一段还未观看完成或者还未观看到第二段的百分之N 的时候,不进行加载第三段。这样大大节省了服务器带宽资源,并且多段分割,减少了HTTP服务器压力,并且可以使用多段多服务器的均衡负载措施。

实现技术:

读取配置文件,如JSON,返回如下关键数据:视频总大小、长度,视频各分段大小长度,各分段关键帧所在的位置(包括字节位置,和时间位置,为什么需要关键帧和如何获取下面讲述。)

读取到配置文件后,循环添加M段mc 加载 ns,通过来回切换实现,切换时会有声音闪断的情况,通过监测qiyi和youku 都发现有这种情况,可能是无法避免,咱不考虑优化。

通过读取到配置文件,填充进度条数据,用户拖动进度条时:按照进度比,找到当前所处的第M段,和鼠标与M段起始的偏移量X(时间和字节数),判断当前段加载到的字节数和偏移量X的大小。加载字节数较大时直接使用ns.seek方法,否则使用ns.play(url?start=X)的方法,即去服务器读取当前段的从start开始的数据(服务器如何配置,以下阐述)。

因为只有关键帧才有意义,所以拖动进度条时,需要将进度条重新定位到最近的关键帧位置处,并且start=X中X参数也需要时关键帧的位置字节数据。

2、关于转换流程

转换软件:

ffmpeg :转换大部分视频、切图、切割视频用

mencoder :转换视频、切图,包括rmvb等

flvmdi:给flv添加meta信息

yamdi :功能同上,有好处:大视频文件不占资源,坏处,有时失败。

mediaInfo:开源的视频信息获取软件,有多种语言的SDK,可以获取所有的视频信息。

flash as3 :通过ns.keyframes获取视频关键帧信息。

切割视频代码:

C:\tool\MPlayer-p4>ffmpeg.exe -ss 00:00:00.0000 -t 00:03:00.0000 -i g:\video\b.f4v -vcodec copy -acodec copy -f flv  g:\video\b1.f4v

视频格式:f4v 、flv  因f4v格式大小比flv小,并且支持h264高清解码,所以逐渐成为主流的格式。

转换过程:

用户上传视频至服务器成功后,发送一条消息到消息队列,转换服务器收到消息后,进行一系列处理:

第一步:使用mediainfo获取视频信息,不符合的格式全部标志转换失败,符合规则的,按照读取的视频格式类型,设置不同的转换参数。

第二步:使用ffmpeg 或者mencoder 转换成完整f4v.

第三步:使用yamdi给转换成功的f4v 添加meta信息。

第四步:使用flash as3 获取刚转换的完整的f4v的关键帧,并存入数据库。

第五步:使用得到的关键帧,按照优化算法得到合适的切分方案,对f4v进行切换(注:若不按照关键帧进行切分,则会引起很大的偏差,具体偏差跟视频的关键帧数量有关系,有些视频能偏差10秒以上),切换成S个小段的f4v视频。

第六步:使用yamdi对切换成功的各个小段视频添加meta信息,并且使用mediainfo 获取并记录各个信息,记录至数据库。

第七步:使用ffmpeg 给完整的F4V视频截图,并存入数据库。

3、关于服务器

使用nginx 添加flv模块支持。具体详见另一章:
nginx中添加start & end参数

抱歉!评论已关闭.