2016笔记——HLS
HLS同时支持流媒体的实时广播和点播服务。同时也支持不同bit速率的多个备用流,允许根据当前网络的宽度去智能调整当前使用的视频流。
安全方面,HLS提供了通过HTTPS加密对媒体文件进行加密并对用户进行验证,允许视频发布者去保护自己的网络。
当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U(m3u8) playlist文件,用于寻找可用的媒体流。
当你的直播内容持续10分钟或者每五分钟内超过5M时,你的APP直播服务必须采用HLS架构,否则不允许上架。
HLS架构:
transport_stream_2x.png其中输入视频源是由摄像机预先录制好的,之后这些源会被编码MPEG-4(H.264视频 ;AAC 音频)格式,然后用硬件打包到MPEG-2的传输流中。MPEG-2传输流会被分散为小片段然后保存为一个或多个系列的.ts格式的媒体文件。这个过程需要借助编码工具来完成,比如Apple stream segmenter。
纯音频会被编码为一些音频小片段,通常为ADTS头的AAC、MP3或者AC-3格式。
上面提及的切片器(segmenter)也会创建一个索引文件,通常会包含这些媒体文件的一个列表,也能包含元数据。他一般都是一个.M3U8的列表,列表元素会关联一个URL用于客户端访问,然后按序去请求这些URL。
服务器端可以采用硬件编码和软件编码两种形式,其功能都是按照上文描述的规则对现有的媒体文件进行切片并使用索引文件进行管理。
媒体编码器获取到音视频设备的实时信号,将其编码后压缩用于传输。而编码格式必须配置为客户端所支持的格式,比如H.264视频和ACC音频。当前,支持用于视频的MPEG-2传输流和纯音频MPEG基本流。编码器通过本地网络将MPEG-2传输流分发出去,送到流切片器那里。标准传输流和压缩传输流无法混合使用。
流切片器(通常是一个软件)会通过本地网络从上面的媒体编码器中读取数据,然后将这些数据切割为一组相等的时间间隔的媒体文件,虽然每一个片段都是一个单独的文件,但是它们的来源是一个连续的流,切完照样可以无缝重构回去。
媒体片段是由切片器生成的,基于编码后的媒体源,并且是由一些列的.ts格式的文件组成,其中包含了你想通过MPEG-2传送流携带的H.264视频和AAC/MP3/AC-3音频。对于纯音频的广播,切片器可以生产MPEG基础音频流,其中包含了ADTS头的AAC、MP3、AC3等音频。
在编码中途,不要修改视频编码器的设置,比如视频大小或者编码解码器类型,如果避免不了,那修改动作必须发生在一个片段边界。并且需要在之后相连的片段上用EXT-X-DISCONTINUITY进行标记。
索引文件(PlayLists)通常由切片器附带生成,保存为.M3U8格式,.m3u格式用于MP3音频的索引文件。
下面这个.m3u8的playlist文件样例,其中包含了13个没有加密的12秒钟的媒体文件。
屏幕快照 2016-07-05 10.00.35.png分布式部分
分布式系统是一个网络服务或者一个网络缓存系统,用于通过HTTP向客户端发送媒体文件和索引文件。不用自定义模块发送内容功能,仅需要简单的网络配置即可使用,这种配置就是限定.M3U8文件和.ts文件的MIME类型。
客户端部分
客户端开始时会去抓取索引文件(.m3u8/.m3u),其中用URL来标记不同的流。索引文件可以指定可用媒体文件的位置,解密的密钥,以及任何可以切换的流。对于选中的流,客户端会有序的下载每一个可获得的文件。每一个文件都包含流中的连环碎片。一旦下载到足够量的数据,客户端会开始向用户展示重新装配好的媒体资源。
客户端负责抓取任何解密密钥、认证或者展示一个用于认证的界面,之后再解密需要的文件。这个过程会一直持续,直到出现结束标记#EXT-X-ENDLIST。如果结束标记不出现,该索引就是用于持续广播的,客户端会定期的加载一些新的索引文件。客户端会从新更新的索引文件中去查找加密密钥,并且将关联的URL加入到请求队列中去。
屏幕快照 2016-07-05 10.12.25.png会话模式
通常包含Live和VOD两种
点播VOD的特点就是可以获取到一个静态的索引文件,其中那个包含一套完整的资源文件地址。这种模式允许客户端访问全部节目。VOD点播拥有先进的下载技术,包括加密认证技术和动态切换文件传输速率的功能(用于不同分辨率视频之间的切换)。
Live会话就是实时时间的录制展示,它的索引文件一直处于动态变化的,你需要不断的更新索引文件playlist,然后移除旧的索引文件。这种类型通过向索引文件添加媒体地址就很容易的转化为VOD类型。在转化时不要移除原来旧的源,而是通过添加一个#EXT-X-ENDLIST标记来终止实时事件。转化时如果你的索引文件中包含EXT-X-PLAYLIST-TYPE标签,你需要将值从EVENT改为VOD。
流切换
如果你的视频具备流切换功能,这对用户来说是一个非常棒的体验,处于不同的带宽、不同的网速播放不同清晰度的视频流,如此智能的流切换会让用户感觉到非常流畅的观影体验,同时不同的设备也可以作为选择的条件,比如视网膜屏可以在网速良好的情况下播放清晰度更高的视频流。
这种功能的实现在于,索引文件的特殊结构:
indexing_2x.png具备流切换的索引通常由主索引和链接不同宽带速率的资源的子索引构成,由子索引再链接对应的.ts视频切片文件。其中主索引只下载一次,而子索引则会不定期的下载,通常会先使用主索引中列出的第一个子索引,之后才会根据当时的网络情况去动态切换适合的流。客户端会在任何时间去切换不同的流,比如连入或者退出一个wifi热点。所有的切换都会使用相同的音频文件,在不同的流之间平滑的进行切换。
这一套不同速率的视频都是由工具生成的。
HLS小结:
屏幕快照 2016-07-05 11.16.59.png加油~