简介

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