HLS简介

作者: yywfy的昵称 | 来源:发表于2019-03-14 16:36 被阅读0次

    视频转码 video transcoding:是指将一个视频码流转换另一个视频码流,以适应不同的网络带宽,不同的终端处理能力和不同的客户需求。点播系统中的转码一般是离线转码,直播系统中的转码为即时转码。

    终端适配:将特定格式的视频转换成终端适配能力较高的视频,以便在最广泛的终端上实现分发。例如,将AVI格式(对网络播放支持不友好)的视频转码成MP4(几乎所有网络播放器都支持),以便在互联网上进行分发;

    带宽适配:将视频转码为超清、高清、标清等多路不同码率的视频,以便不同网络带宽的用户选择不同码率的视频;

    播放友好:优化视频封装格式,以实现更好地播放效果;例如,某些MP4文件的MOOV头可能位于尾部,导致部分播放器需要下载整个MP4文件之后才能开始播放;可以通过转码将MOOV头调整到文件头部,以便播放器无需下载整个文件便可以开始播放;

    增加水印:在视频中增加版权相关图片(例如电视台的台标),宣示视频本身的版权归属;

    降低分发带宽:使用更先进的编码方式对视频进行编码,确保在不降低画质的前提下降低视频码率,从而达到节省带宽的目的;例如对原本使用H.264编码的视频进行H.265编码;

    降低存储成本:对于以归档、备案为目的的视频,直接存储原始视频可能会带来较高的存储成本,此时可以将视频转为低码率进行存储,从而大幅降低视频存储成本。

    HLS:HTTP Live Streaming,是由苹果公司提出的基于HTT的流媒体网络传输协议。他的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从愈多不同的备用源中以不同的速率下载同样的资源,允许流媒体绘画适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含源数据的extended M3U(m3u8)playlist文件,用于寻找可用的媒体流。

    HLS协议规定:

    视频的封装格式是TS。

    视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。

    除了TS视频文件本身,还定义了用来控制播放的m3u8文件(文本文件)。

    HLS 框架图

    把视频文件上传到服务器上,视频会被转换成HLS格式的视频(即TS和m3u8文件)。Media encoder模块负责将视频源中的视频数据转码到目标编码格式(H264)的视频数据,然后Stream Segment模块将视频切片,切片的结果就是index file(m3u8)和ts文件了。

    HLS index file

    HLS的index文件就是m3u8的文件,先下载一级index file(master_playlist.m3u8),它里面记录了二级索引文件的地址(Alternate-A、Alternate-B、Alternate-C)的地址,然后客户端再去下载二级索引文件,二级索引文件中又记录了TS文件的下载地址,这样客户端就可以按顺序下载TS视频文件并连续播放。

    master_playlist.m3u8:

    #EXTM3U

    #EXT-X-VERSION:3

    #EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=354986,RESOLUTION=320x180    //视频流的比特率和分辨率

    v.f210.m3u8    //二级index文件的路径,可以是相对路径,也可以是绝对路径

    #EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=633293,RESOLUTION=640x360

    v.f220.m3u8

    #EXT-X-STREAM-INF:PROGRAM-ID=0,BANDWIDTH=1198319,RESOLUTION=1280x720

    v.f230.m3u8

    master_playlist.m3u8文件中记录了不同比特率视频流的二级index文件路径,客户端可以自己判断自己的现行网络带宽,来决定播放哪一个视频流。也可以在网络带宽变化的时候平滑切换到和带宽匹配的视频流。

    #EXTM3U   //每个M3U文件第一行必须是这个tag,提供标示作用

    #EXT-X-VERSION:3   //用以标示协议版本。这里是3, 那么这里用的就是HLS协议第三个版本,此标签只能有0或1个,不写代表使用版本1

    #EXT-X-TARGETDURATION:17  //EXT-X-TARGETDURATION指定当前视频流中的切片文件的最大时长,也就是说这些ts切片的时长不能大于#EXT-X-TARGETDURATION的值。

    #EXT-X-MEDIA-SEQUENCE:0 //切片的开始序号。每一个切片都有唯一的序号,相邻之间序号+1。这个编号会继续增长,保证流的连续性。

    #EXT-X-KEY:METHOD=AES-128, //HLS可以被加密。客户端通过读取M3U8文件中的#EXT-X_KEY标签可以获取解密的密钥。EXT-X-KEY指示的密钥信息作用于当前EXT-X-KEY标签至下一个EXT-X-KEY标签(若没有下一个,则到最后一个Segment)之间的所有Segments。METHOD指示加密算法,可用的取值有NONE、AES-128和SAMPLE-AES,NONE表示不加密。URI指示获取密钥的路径,该项不可省略,除非METHOD为NONE。

    #EXTINF:2.000000,   //EXTINF表示每个ts切片视频文件的时长

    v.f230.ts?start=0&end=204735&type=mpegts //ts文件的下载地址,这里同样使用了相对路径。

    ...

    #EXT-X-ENDLIST     //EXT-X-ENDLIST这个表示视频结束,有这个标志同时也说明当前的流是一个非直播流。

    播放模式

    点播VOD的特点就是当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的m3u8的结构。

    Live模式就是实时生成M3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。

    相关文章

      网友评论

          本文标题:HLS简介

          本文链接:https://www.haomeiwen.com/subject/otutmqtx.html