第一个是RTSP(Real Time Streaming Protocol)实时流传输协议,是基于文本的多媒体播放控制协议,属于应用层。这里可能还会提到RTMP,这个其实就是Adobe私有的协议,一般走flv或者f4v格式流。它与RTSP是一路的,只不过RTSP是公开的,而且RTMP很老旧了,受支持也越来越少。RTSP传输的一般是TS或者MP4流,需要有支持该协议的客户端,当然也需要搭建一个RTSP协议服务器来提供播放服务。其缺省端口是554,简单的测试URL如:
rtsp://192.168.1.67:554/test
该方式播放流媒体视频我没有试过,需要单独搞一个RTSP协议的服务器也觉得麻烦,更主要的是其使用不够广泛。
第二个是HLS(HTTP Live Streaming)协议,由苹果公司开发的流媒体传输协议。这个以前研究过一些,知道流程。其原理是将一个大文件分成多个小文件,得到的m3u8配置文件就是各个小文件的信息表,客户端基于HTTP协议下载这些小文件。这个协议是支持动态码率的,客户端可以选择不同码率的同一段资源进行下载。这个以前用的时候并没有试过动态码率,只是用ffmpeg简单转换mp4文件得到一堆ts文件和一个m3u8播放列表。HLS协议规定视频封装格式是TS,编码格式是H264或者H265。相比与RTSP实时性不够,而且产生较多文件碎片,切片多个进行小文件分发也不够友好。另外HLS标准(或者苹果自有的HDS与微软的Smooth Streaming)已经是走下坡路了,如这篇文章介绍:
https://www.dacast.com/blog/mpeg-dash-vs-hls-what-you-should-know/
第三个是HTTP,也就是我正在用的。利用http服务器,直接输入一个mp4文件地址,即可在浏览器中进行播放。MP4是支持最为广泛的,http协议与http服务器应用是最广泛的,无需搭建别的服务器即可在线播放视频流。这里说的HTTP方式也就是HTTP Progressive Streaming,能够支持视频在线播放,拖拽进度等。
第四个是MPEG-DASH(Dynamic Adaptive Streaming over HTTP),新出的流视频播放控制协议,从名字也能看出是基于HTTP协议的。同HLS一样,它支持动态码率,用Youtube的应该知道它用的DASH,可以支持不同网络情况下播放不同清晰度的视频。相比较于HLS,DASH能以更低的码率传输更好的画面。不过该标准目前是大公司如Netflix和Youtube等在推广,支持程度还不是特别广泛。
以上几种方式基本就是当前视频流在线播放的主要方案,利弊也都分析了,下面是AVPro文档中的截图:
可以看出HTTP方式还是非常适合的,当前国内视频平台基本也用HTTP方式提供点播服务。
下面就是第二部分了,mp4文件在线流播放时如何工作的呢?可以参考这篇文章:
https://rigor.com/blog/2016/01/optimizing-mp4-video-for-fast-streaming
这篇文章提到,mp4容器格式封装的h264编码的视频成为了在线html5视频的标准,所以优化在线视频流播放就基本说的时mp4文件的优化。首先就是基本概念,mp4文件是由许多数据块组成,存储了章节和音视频信息等。其中有一个moov块是最主要的,记录了该mp4文件的基础信息如每秒多少帧等,该部分的作用类似目录。当播放视频的适合,首先就是要找到moov块,但是不幸的是这些块顺序却可以不一致,比如用mp4info这个小工具看看:
这里说的moov就在第二处,比mdat靠前。如果moov靠后,浏览器播放在线视频的时候一开始请求不到这一块,就会往后面看下一个块,多请求几次。浏览器用HTTP Range Request先请求个几百K字节,这是第一次请求。得到206 Partical Content HTTP代码,可能没有找到moov。接着浏览器找后面几百K字节,找到moov块,从而准备好播放视频元信息。如这个博客截图:
实际上就会浪费几百K字节和几百毫秒,因此也就有了优化的方法,就是将moov提前:
ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4
如下:
根据我实际测试,faststart确实有没有差不多,一两百毫秒变化基本感觉不到,所以说一个一般的mp4文件就可以在线流播放,不用单独处理了。
另外补充一下国内几大视频网站使用的在线视频播放方式,作为以后我的有关视频播放工作的参考对比。
先说优酷,这个也是老牌的视频网站了,参考:
http://www.cnblogs.com/zhaojunjie/p/4009192.html
细节不说,结论是优酷用的时m3u8方式,也是基于HTTP的,片段如下:
#EXTM3U
#EXT-X-TARGETDURATION:12
#EXT-X-VERSION:3
#EXTINF:6.006,
http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=0&ts_end=5.906&ts_seg_no=0&ts_keyframe=1
#EXTINF:5.464,
http://59.108.137.14/65666E0ED34581E6B96293A18/0300010F005430BCBA49631468DEFEC61C5678-3A78-37BA-1971-21A0D4EEA0E7.flv?ts_start=5.906&ts_end=11.37&ts_seg_no=1&ts_keyframe=1
视频封装为flv格式,分割为多个片段,组合为m3u8列表,提供在线视频播放功能。实际上我可能对HTTP Progressive Streaming和HLS的区分还不很清晰,HLS中的H就是HTTP,实际上m3u8也是基于HTTP提供视频播放的,不需要单独搭建协议服务器提供后台服务。那么与HTTP Progressive Streaming的区别到底在哪,只是一个切片,一个不切片来通过HTTP播放视频吗?这里再找一些资料加以理解:
先说一下HTTP Progressive Streaming,这个类似于progressive download,不同之处则是Progressive Streaming时把视频缓存再内存中的,而不是永久存储设备中。那还是和HLS很像啊,这就要对比下HTTP Progressive Streaming和HLS了。HTTP Progressive Streaming能够不用完整下载视频就播放,相比于HLS不足之处是质量不能改变也就是就一个片源,而且安全性较差,可以看下这一段英文解释:
实际上就和前面说的差不多,也就是二者很相似,都是基于HTTP进行缓存播放,HLS可以提供多个源切换清晰度,比如优酷就用HLS方式,切片且提供不同质量的多个视频源。
接着是腾讯,这个比优酷来说感觉更新一些,可能也更清晰一些,参考:
https://blog.csdn.net/szu_it_man/article/details/80449751
这个博客给出了腾讯视频的方案,和优酷不同是,腾讯用的就是mp4,也就是直接HTTP Progressive Streaming一个mp4文件。当然腾讯能切换不同清晰度,因为其提供了多个不同质量的mp4文件。分析结果片段如下:
下面是爱奇艺的了,参考:
https://blog.csdn.net/qq405935987/article/details/83789697
爱奇艺用的是f4v格式的视频,基于https,而且也出现了m3u8的有关内容,如果划分到上面四种,是属于HLS的。分析片段如下:
所以国内这三个大型的视频网站没有用RTSP来提供在线视频播放服务,其中主要是用m3u8分片提供不同清晰度视频,而腾讯则跳出了m3u8,用起了mp4。
所以说,用mp4来提供在线视频播放没有问题,而且对于没有清晰度切换需求的业务,比m3u8也要更加轻便。
f4v既然遇到了,也记录下,百度百科有一些介绍:
F4V是Adobe公司为了迎接高清时代而推出继FLV格式后的支持H.264的F4V流媒体格式。它和FLV主要的区别在于,FLV格式采用的是H263编码,而F4V则支持H.264编码的高清晰视频,码率最高可达50Mbps。
现在主流的视频网站(如奇艺、土豆、酷6、优酷)等其他网站都开始用H264编码的F4V文件,H264编码的F4V文件,相同文件大小情况下,清晰度明显比On2 VP6和H263编码的FLV要好。土豆和56发布的视频大多数已为F4V,但下载后缀为FLV,这也是F4V特点之一。需要注意的是,F4V 和MP4 是兼容的格式,都属于ISMAMP4 容器,但是 F4V 只用来封装H.264视频编码和音频AAC。FLV 是Adobe 私有格式,但是也可以用来封装 H.264视频编码、AAC音频编码或H.263视频编码、MP3音频编码。所以不能看到扩展名为 flv 就认为不是H.264 编码的F4V,网络上很多后缀FLV的视频,其实质是更高清晰度的F4V。