【音视频】M3U8与HLS详解
M3U8 和 HLS 是音视频流媒体领域中常见的技术,广泛应用于在线视频点播(VOD)和直播(Live)场景。M3U8 是一种基于文本的播放列表文件格式,主要用于描述媒体文件的位置和顺序,而 HLS(HTTP Live Streaming)是一种流媒体传输协议,由 Apple 公司提出。HLS 使用 M3U8 文件来管理和播放流媒体内容,能够适应不同的网络环境,实现高质量、低延迟的流媒体传输。
M3U8详解
M3U8 是什么
M3U8 是一种基于文本的文件格式,用于描述音视频文件的播放列表。它是 M3U 文件的一种扩展,M3U 文件主要用于音频播放列表,而 M3U8 则用于音视频流媒体播放。M3U8 文件使用 UTF-8 编码,通常用于 HTTP Live Streaming (HLS) 协议中,作为媒体分片的索引文件。
M3U8 文件的组成部分
一个典型的 M3U8 文件包含多个标签,每个标签都以井号(#)开头。以下是 M3U8 文件的主要组成部分:
文件头
- #EXTM3U:所有 M3U8 文件的起始标签,表明这是一个 M3U8 文件。
基本标签
- #EXTINF:<duration>,<title>:描述媒体分片的信息。<duration> 是分片的时长(以秒为单位),<title> 是可选的分片标题。
- URL:实际媒体文件的位置,通常紧跟在 #EXTINF 标签之后。
可选标签
- #EXT-X-TARGETDURATION:<seconds>:指定媒体分片的最大时长。
- #EXT-X-MEDIA-SEQUENCE:<number>:定义播放列表中第一个分片的序列号。
- #EXT-X-VERSION:<number>:指定播放列表文件的协议版本。
- #EXT-X-ALLOW-CACHE:<YES|NO>:指示客户端是否可以缓存播放列表文件。
- #EXT-X-ENDLIST:指示播放列表的结束,常用于点播流。
- #EXT-X-KEY:<attributes>:描述用于解密媒体分片的密钥信息,包含多个属性(如方法、URI 等)。
- #EXT-X-STREAM-INF:<attributes>:用于描述变码率(多码率)流信息,包含分辨率、带宽等属性。
示例 M3U8 文件
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://example.com/segment0.ts
#EXTINF:10.0,
http://example.com/segment1.ts
#EXTINF:10.0,
http://example.com/segment2.ts
#EXT-X-ENDLIST
以上示例展示了一个简单的 M3U8 文件,其中包含版本信息、目标时长、媒体序列号和三个媒体分片。每个分片的时长为 10 秒,URL 指向实际的媒体文件位置。最后,#EXT-X-ENDLIST 标签表示播放列表的结束。
HLS(HTTP Live Streaming)视频封装格式
HLS(HTTP Live Streaming)是由 Apple 公司开发的一种流媒体传输协议,广泛用于直播和点播视频流的传输。HLS 协议将视频文件分割成一系列较小的媒体文件(通常称为分片),通过 HTTP 进行传输,并使用 M3U8 播放列表文件来管理这些分片。
HLS 视频封装格式的主要组成部分
M3U8 播放列表文件
- Master Playlist(主播放列表):用于描述不同比特率和分辨率的变码率流,每个流有一个相应的 Media Playlist。
- Media Playlist(媒体播放列表):包含实际的媒体分片的 URL 和相关信息。每个分片的 URL 通常紧跟在 #EXTINF 标签之后。
媒体分片
- .ts 文件(MPEG-TS):HLS 主要使用 MPEG-TS(MPEG Transport Stream)格式来封装视频和音频数据。每个 .ts 文件是一个视频分片,包含一段视频和音频数据。
- .aac 文件:在某些情况下,音频数据也可以单独存储为 .aac 文件。
示例 HLS 主播放列表文件(Master Playlist)
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=640x360
http://example.com/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5120000,RESOLUTION=1920x1080
http://example.com/high.m3u8
示例 HLS 媒体播放列表文件(Media Playlist)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://example.com/segment0.ts
#EXTINF:10.0,
http://example.com/segment1.ts
#EXTINF:10.0,
http://example.com/segment2.ts
#EXT-X-ENDLIST
HLS 封装格式的特点
- 分段传输:将视频文件分割成小的分片文件,便于在不稳定的网络环境下进行传输。
- 自适应比特率:支持不同比特率和分辨率的流,客户端可以根据网络状况动态选择合适的流进行播放。
- 基于 HTTP 传输:使用标准的 HTTP 协议进行传输,兼容性强,易于通过 CDN(内容分发网络)进行分发。
M3U8与HLS的关系
M3U8 和 HLS 之间的关系可以简单理解为:M3U8 是 HLS 协议中使用的文件格式,用于描述媒体分片的位置和顺序,而 HLS 是整个流媒体传输协议体系。
简单来说:
- M3U8 = 播放列表文件格式(索引文件)
- HLS = 完整的流媒体传输协议
- 关系:HLS 使用 M3U8 作为其核心组成部分
总结
M3U8 和 HLS 是现代视频流媒体技术的重要组成部分。M3U8 作为播放列表文件格式,提供了媒体分片的索引和管理功能;而 HLS 作为完整的传输协议,实现了自适应码率、分段传输等核心功能。两者结合,使得视频流媒体能够适应不同的网络环境,提供稳定、流畅的播放体验。