多媒体文件格式剖析:M3U8篇
M3U8背景介绍
M3U8,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础;是 Unicode 版本的 M3U。
M3U8文件是M3U文件的一种,只不过它的编码格式是UTF-8。M3U使用Latin-1字符集编码。M3U的全称是Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator,即mp3 URL。M3U是纯文本文件;所以UTF-8编码的M3U文件也简称为 M3U8。
HLS 协议概述
HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。M3U8只是它具体的表现形式,下面我们都称为HLS格式。
HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。
在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。
HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。这是HLS应用在直播上的一大优势。
M3U8 格式解析
我们播放一个HLS,首先要对HLS流对应的M3U8文件进行解析,解析M3U8文件,首先要搞清楚M3U8的封装格式。
M3U8 格式可以用于直播,也可以用于点播。
M3U8 类型
M3U8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。
1. 媒体播放列表(Media Playlist)
当 M3U8 文件作为媒体播放列表时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
#EXT-X-ENDLIST
2. 主播放列表(Master Playlist)
当 M3U8 作为主播放列表时,其内部提供的是同一份媒体资源的多份流列表资源。
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://example.com/audio/index.m3u8
#EXT-X-ENDLIST
M3U8 基本字段
- #EXTM3U:M3U8文件头,必须放在第一行
- #EXT-X-MEDIA-SEQUENCE:第一个TS分片的序列号,一般情况下是0,但是在直播场景下,这个序列号标识直播段的起始位置
- #EXT-X-TARGETDURATION:每个分片TS的最大的时长
- #EXT-X-ALLOW-CACHE:是否允许cache,默认情况下是YES
- #EXT-X-ENDLIST:M3U8文件结束符
- #EXTINF:extra info,分片TS的信息,如时长、带宽等
- #EXT-X-VERSION:M3U8版本号
- #EXT-X-DISCONTINUITY:该标签表明其前一个切片与下一个切片之间存在中断
- #EXT-X-PLAYLIST-TYPE:表明流媒体类型
- #EXT-X-KEY:是否加密解析
如何判断M3U8是直播还是点播
方法一:判断是否存在 #EXT-X-ENDLIST
对于一个M3U8文件,如果结尾不存在 #EXT-X-ENDLIST,那么一定是 直播,不是点播;
方法二:判断 #EXT-X-PLAYLIST-TYPE 类型
'#EXT-X-PLAYLIST-TYPE' 有两种类型:
- VOD (Video on Demand):表示该视频流为点播源,因此服务器不能更改该 M3U8 文件
- EVENT:表示该视频流为直播源,因此服务器不能更改或删除该文件任意部分内容(但可以在文件末尾添加新内容)
VOD 文件通常带有 EXT-X-ENDLIST 标签,因为其为点播片源,不会改变;而 EVENT 文件初始化时一般不会有 EXT-X-ENDLIST 标签。
HLS 工作流程
- 服务器端将视频流切分成小片段(通常为TS格式)
- 服务器生成M3U8播放列表文件,包含所有TS片段的URL
- 客户端首先下载M3U8文件
- 客户端根据M3U8文件中的URL依次下载TS片段进行播放
- 对于直播,客户端需要定时重新请求M3U8文件以获取最新片段
M3U8 加密
HLS 支持 AES-128 加密,可以在传输过程中保护视频内容。
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"
加密方式是AES-128,秘钥需要请求指定的URI地址,请求回来存储在本地进行解密播放。
M3U8 的优势与局限
优势
- 基于HTTP协议,易于穿越防火墙和代理
- 易于使用CDN进行分发
- 支持多码率自适应
- 支持加密和DRM
- 服务端简单,只需支持HTTP即可
局限
- 延迟较高,通常有10-30秒延迟
- 不太适合实时直播场景
- 切片文件数量多,对存储有一定要求
总结
M3U8作为HLS协议的核心格式,在视频点播和直播回放场景中应用广泛。虽然在实时性方面不如RTMP等协议,但其简单性、跨平台兼容性和CDN友好性使其成为Web视频分发的主流选择之一。