流媒体格式之HLS
流媒体格式之HLS
在当今数字化的时代,流媒体技术已经成为我们获取信息和娱乐的重要方式。无论是观看精彩的影视作品,还是实时关注重要的新闻事件,流畅、稳定和高质量的流媒体体验至关重要。而在众多流媒体传输格式中,HLS(HTTP Live Streaming)格式凭借其独特的优势和特点,逐渐成为行业内广泛应用的重要技术之一。
HLS协议简介
HLS(HTTP Live Streaming)是苹果公司推出的基于 HTTP 的流媒体传输协议。以下是 HLS 格式的一些关键特点:
- 切片(Segmentation):HLS 将整个媒体内容切割成一系列小的媒体片段,通常每个片段持续几秒钟。这些片段以特定的格式(如 MPEG-TS)存储。
- 索引文件(Playlist):HLS 使用一个索引文件(通常以
.m3u8
扩展名)来描述可用的媒体片段。索引文件包含每个片段的 URL、持续时间、字节范围等信息。客户端通过获取和解析这个索引文件来了解媒体内容的结构,并按顺序请求和播放各个片段。 - 自适应码率切换:HLS 支持自适应码率切换。服务器可以提供多个不同码率的媒体片段,客户端根据当前的网络条件和设备性能选择合适码率的片段进行下载和播放,以保证流畅的观看体验。
- 实时流和点播:HLS 既适用于实时流媒体(如直播),也适用于点播内容。
- 易于部署和缓存:由于基于 HTTP 协议,HLS 可以利用现有的 HTTP 基础设施进行部署,包括缓存服务器等。
HLS的优点与缺点
HLS 的优点包括:
- 广泛的兼容性:在多种设备和平台上得到广泛支持,包括 iOS、Android、网页浏览器等。
- 网络适应性强:能够根据网络状况自动调整码率,减少卡顿和缓冲。
然而,HLS 也存在一些缺点,例如:
- 启动延迟:由于需要先获取索引文件和下载初始的几个片段,可能会导致一定的启动延迟。
- 切片开销:切片过程可能会带来一些额外的开销和处理复杂度。
总的来说,HLS 是一种常用且有效的流媒体传输格式,为用户在不同网络环境下提供了稳定和自适应的流媒体观看体验。
测试地址
- ts:https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8
- fmp4:https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_fmp4/master.m3u8
整体框架
服务器端
- 对原始的媒体内容(如视频、音频)进行编码和切片。
- 将切片后的媒体文件(通常是.ts 格式的视频切片和.m3u8 格式的索引文件)存储在服务器上。
- 响应客户端的请求,提供相应的.m3u8 索引文件和.ts 切片文件。
客户端
- 向服务器请求.m3u8 索引文件。
- 解析.m3u8 文件,获取可用的.ts 切片列表及相关信息(如切片的 URL、持续时间、码率等)。
- 根据网络状况和用户设置,选择合适的码率对应的.ts 切片进行下载和播放。
- 持续监测网络状况,在必要时切换到更适合当前网络的码率对应的切片进行播放,以保证流畅性。
- 处理播放过程中的缓冲、错误恢复等情况。
HLS的工作原理
实际上,HLS 协议的核心要点在于 M3U8 这个文本协议,其生成与解析过程可谓相当简便。M3U8 就好比是视频文件的“菜单”,播放器借助 M3U8 文件,就能顺利下载到对应的视频文件。比如说,当您在手机上观看一部热门电视剧时,播放器就是根据 M3U8 里的“指引”,精准地获取到每一集的视频资源,从而为您流畅播放。常见的结构如下。
HLS 借助 URI 所指向的一个 M3U8 来代表一个媒体流。一个 M3U8 可以是 Media m3u8 或者 Master m3u8 ,它是采用 UTF-8 编码的文本文件,涵盖了一些 URI 以及描述性的 tags 。一个 Media m3u8 包含一个媒体片段的列表,按照顺序播放时,能够完整地呈现整个流。若要播放这个播放列表,客户端首先得将其下载下来,接着依次播放里面的每一个媒体片段。更复杂的情形是,播放列表为一个 Master m3u8 ,其中包含一个 Media m3u8 集合。通常在每个 Media m3u8 里,是同一个流的多种不同版本(例如:不同的分辨率、不同的码率)。
Master m3u8文件
这是一个主m3u8文件,里面有包含了多种比特率的m3u8文件,播放器可以根据网络情况选择不同的子m3u8文件进行播放。当然,不是所有的HLS都有这个主m3u8文件。
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2149280,CODECS="mp4a.40.2,avc1.64001f",RESOLUTION=1280x720,NAME="720"
url_0/193039199_mp4_h264_aac_hd_7.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=246440,CODECS="mp4a.40.5,avc1.42000d",RESOLUTION=320x184,NAME="240"
url_2/193039199_mp4_h264_aac_ld_7.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=460560,CODECS="mp4a.40.5,avc1.420016",RESOLUTION=512x288,NAME="380"
url_4/193039199_mp4_h264_aac_7.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=836280,CODECS="mp4a.40.2,avc1.64001f",RESOLUTION=848x480,NAME="480"
url_6/193039199_mp4_h264_aac_hq_7.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=6221600,CODECS="mp4a.40.2,avc1.640028",RESOLUTION=1920x1080,NAME="1080"
url_8/193039199_mp4_h264_aac_fhd_7.m3u8
EXTM3U
:表示播放列表是扩展的M3U文件。EXT-X-STREAM-INF
:表示该标签下的url的媒体描述信息- 该
EXT-X-STREAM-INF
标签具有以下参数: AVERAGE-BANDWIDTH
(可选,但推荐)表示变体流的平均比特率的整数。BANDWIDTH
(必需)一个整数,表示每个媒体文件的总比特率上限(以比特/秒为单位)。上限值的计算包括播放列表中出现或将出现的任何容器开销。FRAME-RATE
(可选,但推荐)描述变体流中最大帧速率的浮点值。HDCP-LEVEL
(可选)指示使用的加密类型。有效值为TYPE-0
和NONE
。TYPE-0
如果输出未受 HDCP 保护,则使用此选项。RESOLUTION
(可选,但建议使用)可选显示尺寸(以像素为单位),用于显示播放列表中的视频。任何包含视频的流都应包含此参数。VIDEO-RANGE
(根据编码是否必需)有效值为SDR
或 的字符串PQ
。如果未指定转移特征代码 1、16 或 18,则必须省略此参数。CODECS
(可选,但建议使用)带引号的字符串,其中包含以逗号分隔的格式列表,其中每种格式指定播放列表文件中媒体段中存在的媒体样本类型。有效的格式标识符是 RFC 6381 定义的 ISO 文件格式命名空间中的标识符。
Media M3u8文件
我们从主m3u8文件中下载到子m3u8文件,内容如下,拿到这些信息我们就可以播放视频了。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:11
#EXTINF:10.000,
url_462/193039199_mp4_h264_aac_hd_7.ts
#EXTINF:10.000,
//此处省略N个片段名..........................
#EXTINF:4.584,
url_525/193039199_mp4_h264_aac_hd_7.ts
#EXT-X-ENDLIST
EXTM3U
:表示播放列表是扩展的M3U文件。EXT-X-VERSION
:表示播放列表文件的兼容版本。EXT-X-PLAYLIST-TYPE
:提供适用于整个播放列表文件的可变性信息。此标签可能为EVENT
或VOD
。EVENT
表示可以在播放列表可变,不过只能在尾部添加媒体切片;VOD
表示播放列表不可变。EVENT
表示可以用在一些体育赛事的直播,服务器一直在m3u8的尾部添加视频片段,同时用户也可以跳转到之前的片段进行播放。EXT-X-TARGETDURATION
:指定最大媒体文件持续时间。EXT-X-MEDIA-SEQUENCE
:表示播放列表文件中出现的第一个 URL 的序列号。播放列表中的每个媒体文件 URL 都有一个唯一的整数序列号。URL 的序列号比其之前的 URL 的序列号高 1。媒体序列号与文件的名称无关。EXTINF
:表示其后媒体切片的时长(单位为秒)。每个媒体切片之前必须指定该标签。此值必须小于或等于目标持续时间。
加密HLS
在加密HLS中,会使用#EXT-X-KEY
标签,
#EXT-X-KEY:METHOD=AES-128,URI="oceans.key"
浏览器可以通过获取到解密uri,结合加密方式,去解密获取到的每个ts文件。
这里你一定会想,uri都是直接暴露在m3u8文件中的,不是谁都可以请求吗?那有什么用。实际上,加了这个加密的功能,仍能起到一些作用:
- 密钥的时效性和变化:
EXT-X-KEY
中指定的密钥可能是有时效性的,或者在不同的视频片段中会发生变化。这意味着即使客户端获取到当前的密钥,也不能用于解密后续不同片段或不同时间的加密内容。 - 内容的分段加密:视频通常被分割为多个片段进行加密,每个片段可能使用不同的密钥或加密参数,增加了破解的难度。
- 验证和授权:服务器端可以对客户端的请求进行验证和授权,确保只有合法的、被授权的客户端能够获取有效的密钥和访问加密内容。
- **客户端如果有开发能力,可以自定义uri的请求,比如在uri中加入自己的鉴权信息,这样可以达到保护key的作用,
综上所述,虽然客户端可以请求到 EXT-X-KEY
中的内容,但通过上述多种机制的综合作用,仍能保障加密的有效性,防止未经授权的访问和内容的非法传播。