简介
HLS协议(可以先阅读HLS协议章节)包括两个重要的构建块。一种是视频文件的存储方式 (ts),另一种是M3U8索引文件,每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放。一般为了加快速度,.m3u8 放在 web 服务器上,ts 文件放在 CDN 上。
HLS 协议视频支持 H.264 格式的编码,支持的音频编码方式是 AAC 编码。
从视频文件开始。HLS协议期望将视频文件存储在相等长度的较小块中,通常每个长度为10秒。
最初,这些文件必须存储在TS文件(.ts
)中,并以H.264格式编码,并带有AAC音频。
上图表示了一个video中存在m3u8(一般不止一个)文件指向了多个.ts
文件,一般来说每个 .ts 文件的长度约为10s,即上图中含有4个ts文件,所以视频长度为40s
请注意,最新版本的HLS也允许使用片段化的.mp4文件。由于这仍然是新事物,并且某些视频播放器仍需要实现它,因此本文中的示例将使用.ts
文件。
M3U8文件
简介
m3u8 文件,就是以 UTF-8 编码的 m3u(最初创建为组织MP3文件集合的纯文本文件格式)文件,这个文件本身不能播放,只是存放了播放信息的文本文件。
容器格式解析
M3U8文件简版包含URL列表或带有一些其他元数据的本地文件路径。元数据行以#开头。
#EXTM3U m3u文件头
#EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
#EXT-X-TARGETDURATION 每个分片TS的最大的时长
#EXT-X-ALLOW-CACHE 是否允许cache
#EXT-X-ENDLIST m3u8文件结束符
#EXTINF 指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效
stream-1.ts
在HLS 详细版的内容比上面的简版多了一个 playlist或称master。
在 master 中,会根据网络段实现设置好不同的 m3u8 文件,比如,3G/4G/wifi 网速等。一个 master 文件中为:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3615600,CODECS="avc1.4d001f,mp4a.40.2",RESOLUTION=1280x720
live/high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5605600,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=960x540
live/medium.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1755600,CODECS="avc1.42001f,mp4a.40.2",RESOLUTION=640x360
live/low.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=545600,CODECS="avc1.42001e,mp4a.40.2",RESOLUTION=416x234
live/cellular.m3u8
所以说live/high.m3u8(wifi环境,高清)文件里的结构为:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26
#EXTINF:9.901,
https://taobaolive.taobao.com/wifi/segment1.ts
#EXTINF:9.901,
https://taobaolive.taobao.com/wifi/segment2.ts
#EXTINF:9.501,
https://taobaolive.taobao.com/wifi/segment3.ts
TS文件
简介
TS文件为传输流文件,在HLS协议中m3u8文件和ts文件,ts文件主要是存放视频的数据。
容器格式解析
TS文件分为三层:
- ts层 (Transport Stream) 在pes层加入数据流的识别和传输必须的信息
- pes层 (Packet Elemental Stream) 在音视频数据上加了时间戳等对数据帧的说明信息
- es层 (Elementary Stream) 音视频数据
TS层
ts包大小固定为188字节,ts层分为三个部分
- ts header:固定4个字节
- adaptation field:可能存在也可能不存在,主要作用是给不足188字节的数据做填充
- payload:pes数据
ts header
ts层的内容是通过PID值来标识的,主要内容包括:PAT表、PMT表、音频流、视频流。解析ts流要先找到PAT表,只要找到PAT就可以找到PMT,然后就可以找到音视频流了。
PAT表的PID值固定为0。PAT表和PMT表需要定期插入ts流,因为用户随时可能加入ts流,这个间隔比较小,通常每隔几个视频帧就要加入PAT和PMT。
PAT和PMT表是必须的,还可以加入其它表如SDT(业务描述表)等,不过hls流只要有PAT和PMT就可以播放了。
- PAT表:他主要的作用就是指明了PMT表的PID值。
- PMT表:他主要的作用就是指明了音视频流的PID值。
- 音频流/视频流:承载音视频内容。
adaption
自适应区的长度要包含传输错误指示符标识的一个字节。
pcr是节目时钟参考,pcr、dts、pts都是对同一个系统时钟的采样值,pcr是递增的,因此可以将其设置为dts值,音频数据不需要pcr。如果没有字段,ipad是可以播放的,但vlc无法播放。打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。
视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。
PAT格式
PMT 格式
PES层
pes层是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。
- Pes Header 6B
- Optional Pes Header 3-259B
- Payload 最大65526B
PTS是显示时间戳、DTS是解码时间戳。概念如下所述
- PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
- DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
为什么HLS延时相对较高?
HLS 的延时包含了 TCP 握手、m3u8 文件下载与解析、ts 文件下载与解析等多个步骤
可以缩短列表的长度和单个 ts 文件的大小来降低延迟,极致情况下可以缩减列表长度为 1,并且 ts 的时长为 1s,但是这样会造成请求次数增加,增大服务器压力,当网速慢时回造成更多的缓冲。
苹果官方推荐的 ts 时长时 10s,所以这样就会大概有 30s 的延迟。
下一步
接下来让我们来了解下容器格式WebM