注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS
一、引言
当TS Header中的adaptation_field_control属性的值为'10'或'11' 时,TS Header包含adaptation field(适配域):
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第50到51页,适配域包含下图所示部分:
adaptation field(适配域) = 固定部分(固定2字节) + 可选部分 + 填充字节(stuffing_byte)
二、适配域的固定部分
适配域中的固定部分 = adaptation_field_length + discontinuity_indicator + random_access_indicator + elementary_stream_priority_indicator + PCR_flag + OPCR_flag + splicing_point_flag + transport_private_data_flag + adaptation_field_extension_flag
固定部分中的属性加起来总共2字节。
其中:
adaptation_field_length:占8位,为适配域长度,单位为字节,不包含当前字节(也就是说适配域长度不包含adaptation_field_length这个字节)。当adaptation_field_control的值为“11”时,适配域和载荷都存在,Adaptation_field_length的取值范围是0到182。当adaptation_field_control的值为“10”时,仅有适配域,Adaptation_field_length为183:
discontinuity_indicator:占1位,为不连续指示位。如果根据连续性计数器或PCR计算,确认当前分组处于不连续状态,则取值为1:
random_access_indicator:占1位,为随机访问指示位。如果当前分组是一个PES的起始,取值为1:
elementary_stream_priority_indicator:占1位,为ES优先级指示位。取值为1时ES优先级更高:
PCR_flag:占1位,为PCR标识。值为1表示适配域中有PCR域:
OPCR_flag:占1位,为OPCR标识。值为1表示适配域中有OPCR域:
splicing_point_flag:占1位,为接续点标识。值为1表示适配域中有接续倒数计数器域:
transport_private_data_flag:占1位,为传输私有数据标识,值为1表示适配域中有私有数据域:
adaptation_field_extension_flag:占1位,为适配域扩展标识,值为1表示适配域中有适配域扩展域:
三、适配域的可选部分
(一)PCR
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第32页,program clock reference (节目时钟参考,PCR)为MPEG2-TS传输流中的时间戳,从中可以推导出解码器的时间:
PCR使得解码后的内容可以正确地同步播放。最多每100ms,接收方会从TS分组(transport packet)的适配域中得到特定节目的PCR值,PCR的PID由该节目的PMT中的PCR_PID域指定。解码系统应当基于PCR生成高精度的系统校时时钟(System Timing Clock,STC),用于同步声音ES和视频ES的内容。STC是MPEG-2系统里校时的基准。例如,表示时间戳(Presentation timestamp,PTS)的值即是以PCR值为基准的偏移量。
当适配域的固定部分中的PCR_flag属性的值为1时,适配域包含PCR域。PCR域 = 33位的低精度部分(program_clock_reference_base) + 6位的填充部分(reserved) + 9位的高精度部分(program_clock_reference_extension)
program_clock_reference_base属性为PCR_base(i),program_clock_reference_extension属性为PCR_ext(i):
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第39页,system_clock_frequency(系统时钟频率)的值以Hz为单位,并应满足以下约束:
27 000000 – 810 ≤ system_clock_frequency ≤ 27 000000 + 810
system_clock_frequency随时间的变化率≤ 75 × 10^–3 Hz/s
也就是说system_clock_frequency的值约为27MHz:
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第40页,有如下公式:
PCR(i) = PCR_base(i) × 300 + PCR_ext(i)
PCR_base(i) = ((system_clock_frequency × t(i)) ÷ 300) % 2^33
PCR_ext(i) = ((system_clock_ frequency × t(i)) ÷ 1) % 300
所以:
PCR = program_clock_reference_base × 300 + program_clock_reference_extension
更多关于PCR的测量方法可以参考:《https://download.tek.com/document/25W_14617_1.pdf》
(二)OPCR
OPCR为原PCR(Original PCR),格式与PCR相同,在TS复制时使用。当适配域的固定部分中的OPCR_flag属性的值为1时,适配域包含OPCR域。OPCR域 = 33位的original_program_clock_reference_base + 6位的reserved + 9位的original_program_clock_reference_extension:
(三)Splice countdown
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第55页,Splice countdown为接续倒数计时器,指示从当前分组起多少个分组之后接续点出现(取值可为负)。当适配域的固定部分中的splicing_point_flag属性的值为1时,适配域包含Splice countdown域:
四、适配域的填充字节(stuffing_byte)
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第61页,stuffing_byte为填充字节。其每个位的值都为1,可以由编码器插入,被解码器丢弃: