一、直播/点播概述
2016年是被称作直播元年,各种直播应用百花齐放,经过几年的发现已经日趋成熟,但其应用技术基本如下图所示
推流 是指将采集的内容传到服务器的过程
拉流 是指用户播放该内容的过程
如果只考虑拉流过程,也可以称作点播,比如爱奇艺、腾讯视频等视频类网站。
我们可以看到HLS协议是拉流过程中常用的协议。
二、HLS简介
HTTP Live Streaming(缩写是 HLS )是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。是苹果公司 QuickTime X 和 iPhone 软件系统的一部分。它的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8)playlist 文件,用于寻找可用的媒体流。
特点:
苹果开发,背景强大,Apple和安卓都支持
基于HTTP协议传输,可以用CDN进行分发
自适应码率流播,客户端会根据网络状况自动选择不同码率的视频
用 m3u8 文件作为索引
视频分段,可以拖动,每次只下载一小部分数据(10秒)
视频的封装格式是TS,视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。
缺点:
延迟会比较高
三、HLS原理
3.1 工作模式
如下图所示,先下载 M3U8 文件,然后拿到一级和二级的 Index 文件,通过 Index 文件取得 TS 文件下载地址,这样客户端就可以按顺序下载 TS 视频文件并连续播放。
3.2 m3u8文件格式(单码率适配流)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:2
#EXT-X-TARGETDURATION:16
#EXTINF:14.357,no desc
livestream-2.ts
#EXTINF:15.617,no desc
livestream-3.ts
#EXTINF:14.358,no desc
livestream-4.ts
#EXTINF:15.618,no desc
livestream-5.ts
3.3 播放模式
点播 就是当前时间点可以获取到所有 index 文件和 TS 文件,二级 index 文件中记录了所有 TS 文件的地址。这种模式允许客户端访问全部内容。
直播 就是实时生成 M3u8 和 TS 文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级 index 文件,以获得最新生成的 TS 文件播放视频。如果一个二级 index 文件的末尾没有 #EXT-X-ENDLIST 标志,说明它是一个 Live 视频流。(比如IPTV电视,http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8)
四、使用ffmpeg创建HLS
可以使用下面的命令
mkdir -p __ABC.mp4__
ffmpeg -i ABC.mp4 -c copy -bsf:v h264_mp4toannexb -hls_time 6 -hls_list_size 0 -hls_segment_filename "__ABC.mp4__/%04d.ts" "__ABC.mp4__/video.m3u8" > /dev/null 2>&1
创建完成后的m3u8和ts文件可以使用Html5的dplayer直接播放
五、HLS的加密和防盗链
在一些点播需要收费的网站,比如爱奇艺,花了钱买的版权,视频是不能随便下载的,加密和防盗链成了一项重要技术。
HLS支持AES-128方式加密,只需要在ffmpeg切片是加上密钥,并在m3u8文件里指定密钥就可以
#EXT-X-KEY:METHOD=AES-128,URI="/hls/key.key"
但这样的话,客户端可以看到key的内容,意义不大,太不安全了。
想要真正安全可以做成动态密钥,根据用户id、浏览器UA、cookie等综合计算,实时生成密钥,并且每段视频密钥可以不一致,不同的时间密钥也不一致。如下图,动态密钥的方式成本很高。涉及密钥的动态获取,可能涉及到视频实时加密。
防盗链一般根据用户信息(比如时间戳、用户id、浏览器UA、cookie、用户IP地址)通过一定的算法生成一串KEY,与服务器对比,如果KEY相同就允许访问,KEY一般有时间限制,过了限制时间就无效了,现在的CDN对于防盗链支持的很好,可以充分利用CDN鉴权机制。
五、新国际标准DASH协议
DASH(MPEG-DASH)是 Dynamic Adaptive Streaming over HTTP的缩写,是国际标准组 MPEG 2014年推出的技术标准,主要目标是形成IP网络承载单一格式的流媒体并提供高效与高质量服务的统一方案,解决多制式传输方案(HTTP Live Streaming,Microsoft Smooth Streaming,HTTP Dynamic Streaming)并存格局下的存储与服务能力浪费、运营高成本与复杂度、系统间互操作弱等问题.
DASH是基于HTTP的动态自适应的比特率流技术,和HLS,HDS技术类似,都是把视频分割成一小段一小段,通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4等多种格式,可以将视频按照多种编码切割,下载下来的媒体格式既可以是ts文件也可以是mp4文件,所以当客户端加载视频时,按照当前的网速和支持的编码加载相应的视频片段进行播放。
国内的哔哩哔哩使用了DASH协议。
与HLS协议的m3u8索引文件类似,DASH协议也提供了MPD(Media Presentation Description)描述文件(XML格式)来对媒体流的下载地址、分辨率、码率、时长、各个分片、编码方式等进行了规定。
DASH的分片(Segment)中可以包含mp4文件(fMP4,文件扩展名通常为.m4s或直接用.mp4),也可以包含TS文件,但整个标准更加prefer使用分片的mp4文件。
参考资料
http://billchan.me/2019/04/27/livestreamprotocol/
https://github.com/Pearlulu/h5ai_dplayer_hls
https://zhuanlan.zhihu.com/p/69184805