TS 格式:为什么直播回放的切片一般都用它?丨音视频基础

2022-06-13 12:24:24 浏览数 (1)

新西兰·尼尔森湖国家公园

(本文基本逻辑:TS 封装格式概览 → TS 层解析 → PES 层解析 → ES 层解析)

TS 全称是 MPEG2-TS,是一种音视频封装格式,其中 TS 表示 Transport Stream。MPEG2-TS 定义于 MPEG-2 第一部分:系统(即 ISO/IEC 标准 13818-1 或 ITU-T Rec. H.222.0)。

TS 主要是用于传输流,它可以实时传输节目内容,这就要求从传输流的任一片段开始都是可以独立解码的,在直播中可以用到。也正是因为 TS 任一切片开始都可以独立解码,所以它非常适合按切片的方式存储直播内容。TS 流中不支持快进快退,这个需要从协议层来支持,比如 HLS 协议对相关的能力做了定义。

1、TS 格式概览

TS 流的结构整体可以分为几个层次:

  • TS(Transport Stream) 层,即传输流层。对分组化基本流数据打包,加上了用于网络传输相关的信息。
  • PES(Packetized Elementary Stream) 层,即分组化基本流。主要在音视频数据的基础上带上了时间戳信息。
  • ES(Elementary Stream) 层,基本流层。主要包含实际的音视频数据,一般视频为 H.264 编码数据,音频为 AAC 编码数据。

下图是 TS 格式的结构:

2、TS 层

TS 层的数据包大小固定,必须为 188 字节。其中包括:头部(TS Header)和载荷(Payload Data)这 2 个部分,其中 TS Header 又包括固定长度部分和可选部分,固定部分长度为 4 字节,可选部分包括适配域(Adaptation Field)。

对于 TS 层数据结构的描述如下图所示:

2.1、头部

TS Header 主要包含的数据主要是传输流的头信息,用于传输和包分组。这些数据包括固定长度部分和可选部分。

2.1.1、固定部分

TS Header 的固定部分为 4 字节,包括下列字段:

  • sync_byte,同步字节,为固定的 8 比特字段,其值为 0100 0111 (0x47)。在对于其他正式出现字段的 赋值选择中,比如 PID,应避免和 sync_byte 重复。
  • transport_error_indicator,传输错误指示位,1 比特,发送时(调制前)值为 0。接收方的解调器在无法成功解调(即使有前向纠错机制)TS 分组内容时,将该位设置为 1,表示该 TS 分组损坏。
  • payload_unit_start_indicator,载荷单元开始指示位,1 比特,负载单元起始标示符,一个完整的数据包开始时标记为 1, 表示携带的是 PES 或 PSI 第一个包。PSI(Program Specific Information)由对于传输流的多路分解以及节目成功再现所必要的标准数据组成。
  • transport_priority,传输优先级,1 比特,值为 1 时,在相同 PID 的分组中具有更高的优先权。传输机制可以使用该字段优先考虑基本流内的该包数据。
  • PID,用于识别 TS 分组的 ID,13 比特。一个 PID 对应一个特定的 PES。
  • transport_scrambling_control,传输加扰控制,2 比特。值为 00 时表示载荷未加扰。其余值由具体系统定义。
  • adaptation_field_control,适配域存在标志,2 比特。值的含义如下:
    • 00,供未来使用,由 ISO/IEC 所保留。解码器应丢弃设置为 00 值的传输流包。
    • 01,无 adaptation_field,仅有效载荷。在空包的情况中,值应为 01
    • 10,仅有 Adaptation_field,无有效载荷。
    • 11,Adaptation Field 后跟着有效载荷。
  • continuity_counter,连续性计数器,4 比特。取值为 0x000x0F,循环使用。用于检查同一个 PID 的 TS 分组的连续性。每当一个 TS 分组中包含载荷时,该计数器加 1。

以上便是 TS Header 固定部分的所有字段,一共 32 比特,4 字节。

2.1.2、适配域

适配域(Adaptation Field)中的数据主要用于携带一些额外信息以及做数据填充以确保 TS 的一个包大小固定在 188 字节。

当 TS Header 中的 adaptation_field_control 字段值为 1011 时,这就表明存在适配域(Adaptation Field)部分。

对于 Adaptation Field 部分的数据结构的描述如下图所示:

总体来讲,适配域数据填充部分是配合着载荷(Payload Data)部分来的,载荷部分数据多,则适配域的填充数据少,反之亦然,最终保证 TS 的包大小为 188 字节。

适配域的部分字段解释:

  • adaptation_field_length,适配域部分的长度,8 比特。单位为字节,不包含当前字段字节。0 值表示传输流包中插入单个填充字节。当 adaptation_field_control 值为 11 时,此时表示后面有载荷,adaptation_field_length 值必须在 0 到 182 的区间内。当 adaptation_field_control 值为 10 时,此时表示后面无载荷,adaptation_field_length 值必须为 183。对于承载 PES 包的传输流包,只要存在欠充足的 PES 包数据就需要通过填充来完全填满传输流包的有效载荷字节。
  • discontinuity_indicator,不连续指示位,1 比特。如果根据连续性计数器或 PCR 计算,确认当前分组处于不连续状态,则取值为 1。不连续性指示符用于指示两种类型 的不连续性,系统时间不连续性和 continuity_counter 不连续性。
  • random_access_indicator,随机访问指示位,1 比特。如果当前分组是一个 PES 的起始,取值为 1。
  • elementary_stream_priority_indicator,ES 优先级指示位,1 比特。表示有效载荷内承载的基本流数据的优先级,1 表示该有效载荷具有 比其他传输流包有效载荷更高的优先级。
  • PCR_flag,PCR 标识位,1 比特。1 表示适配域存在 PCR 数据。
  • program_clock_reference_base program_clock_reference_extension,即 PCR(Program Clock Reference)数据。结构为 33 位的基础部分 9 位的扩展部分,共 42 比特。PCR 表示包含 program_clock_reference_base 最后比特的字节到达系统目标解码器输入端的预期时间。它用于时钟同步,使得解码后的内容可以正确地同步播放。
  • splice_countdown,倒数计数器,8 比特。可以为正或负的值。正值表示传输流中有相同 PID 的距离拼接点剩余传输流包的数量。复制的传输流包和仅包含自适应字段的传输流包被排除。相关 splice_countdown 字段达到零的传输流包中的最后字节之后的位置即为拼接点的定位。在 splice_countdown 达到零的传输流包中,传输流包有效载荷的最后数据字节必须是编码音频帧或编码图像的最后字节。
  • private_data_byte,私有数据,8 比特。可包含多组。
  • splice_type,拼接类型,4 比特。从此字段的首次出现向前,在该字段存在的相同 PID 的所有连续传输流包中,它都具有相同的值,直至 splice_countdown 达到零的包出现时为止(包括该包)。
  • DTS_next_AU,解码时间标记下一个存取单元,以 3 部分编码,共 33 比特。在连续和周期解码通过此拼接点的情况中,它表示跟随拼接点的第一个存取单元的解码时间。此解码时间以时间基表示,在 splice_countdown 字段达到零的传输流包中生效。从首次出现此字段向前,在它存在的相同 PID 的所有后续传输流中该字段均必须有相同值,直到 splice_countdown 字段达到零的包出现时为止(包括此包)。
  • stuffing_byte,填充数据,8 比特。可包含多组。

2.2、载荷

当 TS Header 中的 adaptation_field_control 字段值为 0111 时,这就表明存在载荷(Payload Data)部分。

载荷部分对应的是 TS 层数据结构的 data_byte 字段。

  • data_byte,该字段 8 比特一个单位,可包含多组。该数据必须来自 PES 包、PSI 分段以及 PSI 分段后的包中相连贯的数据字节,或者不在这些结构中的专用数据。如 PID 所指示的。在具有 PID 值 0x1FFF 的空包情况中,data_bytes 可以指派为任何值。data_bytes 数 N 通过 184 减去 adaptation_field() 中的字节数来确定。

3、PES 层

PES 的整体结构:

对于 PES 层数据结构的描述如下图所示:

PES 包中的部分字段解释:

  • stream_id,表示基本流的类型和编号。
  • PES_packet_length,表示 PES 包中在该字段后的数据字节数,该字段 16 比特。
  • PTS,表示显示时间戳。分为 3 段,共 33 比特。
  • DTS,表示解码时间戳。分为 3 段,共 33 比特。
  • ES_rate,基本流速率,在 PES 流情况中,指定解码器接收 PES 包字节的速率。
  • trick_mode_control,表示相关视频的特技方式,3 比特字段。这些特技方式包括:快进、慢动作、冻结帧、快速反向、慢反向等。
  • PES_packet_data_byte,表示来自包 stream_id 或 PID 所指示的基本流的连贯数据字节。该字段 8 比特一个单位。

4、ES 层

ES 层指的就是音视频基本数据,一般视频为 H.264 编码数据,音频为 AAC 编码数据。

5、TS 流的生成和解析

1)TS 流的生成流程大致如下:

  • 1、将原始的音视频数据编码后,组成基本码流(ES);
  • 2、将基本码流(ES)打包成 PES;
  • 3、在 PES 中加入需要的信息,比如 PTS、DTS 等;
  • 4、将 PES 包的数据装载到一系列固定长度为 188 字节的传输包(TS Packet)中;
  • 5、在 TS 包中加入需要的信息,比如 PSI、PCR 等;
  • 6、连输输出 TS 包形成具有恒定码率的 TS 流。

2)TS 流的解析流程大致如下:

  • 1、从 TS 流中解析出 TS 包;
  • 2、从 TS 包中获取流信息,比如 PSI、PCR 等;
  • 3、获取特定节目的音视频 PID;
  • 4、通过 PID 获取特定音视频相关的 TS 包,从中解析出 PES 包;
  • 5、从 PES 包中获取 PTS、DTS 等时间戳信息,并从 PES 中解析出基本码流(ES);
  • 6、将基本码流数据交给解码器,解码出原始音视频数据。

本文参考

1)ISO/IEC 标准 13818-1

https://www.iso.org/obp/ui/#iso:std:iso-iec:14496:-14:ed-3:v1:enhttps://www.etsi.org/deliver/etsi_tr/102100_102199/102154/01.01.01_60/tr_102154v010101p.pdf

(通过上文的介绍,我们了解了 TS 媒体封装格式。TS 封装格式配合 M3U8 封装格式形成了 HLS 的常见实现形式,这在直播回放场景中常有应用。关于媒体封装格式的探讨,暂时告一段落,我们将在后面继续探讨常见的音视频协议,敬请期待)

- 完 -

0 人点赞