最新版的91Flv云视频系统采用了最先进的m3u8列表播放方式,我们的软件从最开始输出flv到mp4再到xml列表到现在的m3u8列表,到底经历了怎样的曲折历程让我们选择了这种播放格式?

首先我们来分析一下几种常用播放格式的优劣对比:

FLV 是FLASH VIDEO的简称,FLV流媒体格式是一种新的视频格式,全称为Flash Video。

flv的优势就是压缩率高,支持网页flash播放器播放,唯一的缺点是在没有flash的环境则无法播放,而现在flash已是日落西山,安卓和IOS的移动设备网页方式都不支持flash环境,当然flv的视频文件在无flash的移动设备上面就无用武之地了。

随着客户在移动端播放的需求日益强烈,我们的转码软件开始输出mp4格式文件,经过测试,发现优秀的软件压缩mp4跟flv压缩率几乎相差无几,于是我们把输出格式统一为mp4,经过我们软件处理后的mp4文件能实现无缓冲拖拽播放(快进播放),也解决了部分视频文件有声音无画面的问题,赢得了客户的好评。

随着客户的增加,mp4文件播放的弊端也日益凸显,主要集中在两个方面,一是当视频时长比较长的时候,mp4的关键帧元素往往很大,需要加载很长时间才能开始播放,网速不好的情况缓冲加载就要20多秒的时间,客户早已急不可耐。二是当用户打开一个视频播放的时候,浏览器会持续请求下载mp4文件直到下载完成,就算是用户暂停视频播放浏览器也会持续这种下载状态,如果这个视频文件是500M则会请求服务器下载500M文件,是1G则会不停下载1G,给服务器硬盘和宽带造成很大浪费和压力。

于是我们参考优酷土豆等大型视频网站系统的播放文件,发现他们的视频文件都是分段播放的,即把一个大的视频文件按照一定大小或时长把一个视频分为N段播放,这样的优势是打开视频加载速度快,可以达到秒播,另外一个优势是在ckplayer的强大支持下,当视频播放第N段的时候,浏览器会下载N+1段,N+2则不会下载,大大缓解了服务器硬盘和宽带压力,可知道高昂的宽带成本才是视频网站的最大压力。这样的视频文件处理方式得到了大量客户的一致好评。

可是很快我们又发现了一个很严重的问题,xml分段列表的视频在IOS上面也是一筹莫展,为了让视频在IOS设备播放还得保留mp4文件给IOS设备播放。于是m3u8播放列表登场了。

m3u8这种播放格式支持目前市面的windows、androis、ios设备主流的浏览器,同样的视频文件既可以在flash环境播放,又能在无flash的html5环境播放,它的优势还不止于此,它可以实现多种码率在不同网速下的自动切换,网速好自动切换高清晰度视频,网速慢自动播放低清晰度文件,还可以实现流加密(视频文件本身加密)、分段下载播放、任意时间点拖拽播放、随机视频文件广告插入等等优势,所以最新版的91Flv云视频系统仅把m3u8作为唯一的播放格式而放弃了其他格式的输出。

转载自:http://bbs.ckplayer.com/forum.php?mod=viewthread&tid=16339


ffmpeg简单用法

1. 编码转换

# webm格式转为m3u8格式
ffmpeg -y  -i "a.webm" -strict -2  "a.m3u8"

ffmpeg参数说明

-i 后面是输入文件名。
-vcodec 后面是编码格式,h264 最佳
附加选项:
-r 指定帧率,
-s 指定分辨率,
-b 指定比特率;于此同时可以对声道进行转码,
-acodec 指定音频编码,
-ab 指定音频比特率,
-ac 指定声道数,

ffmpeg -i out.ogv -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 out.mp4

2. 视频关键帧

ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
  • -i : 输入视频,
  • -vf: 是一个命令行,表示过滤图形的描述, 选择过滤器select会选择帧进行输出:包括过滤器常量
  • pict_type和对应的类型:PICT_TYPE_I 表示是I帧,即关键帧。
  • -vsync 2:阻止每个关键帧产生多余的拷贝
  • -f image2 name_%02d.jpeg:将视频帧写入到图片中,样式的格式一般是:
    “%d” 或者 “%0Nd”
  • -s:分辨率,1920*1080

3. 获得视频时长

# 获得视频的时长
ffmpeg -i test.flv 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
# 视频的描述信息,之后可以使用shell命令获取相关信息
ffmpeg -i test.flv 2>&1