一、引言
PMT(Program Map Table)与PAT表成对出现,其PID由PAT表给出。通过PMT表可以得到该节目包含的视频和音频信息,从而找到音视频流:
二、PMT表中的属性
根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第79页,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map section)组成,TS program map section就是组成PMT表的Section(段)。TS program map section包含下图所示部分:
即:
其中,比较重要的属性是:
table_id:占8位,为表id。TS program map section的table_id固定为0x02:
section_syntax_indicator:占1位,为段语法标志位,值必须为1:
section_length:占12位,为该TS program map section从program_number属性开始到该Section结束(包含CRC校验)的总长度,单位为字节。所以section_length的值加3才是该TS program map section的实际总长度:
program_number:占16位,为节目号,TS流中一个频道的唯一标志。跟PAT表的program_number属性对应上:
current_next_indicator:占1位。值为1:发送的TS program map section为当前有效的,值为0:发送的该Section尚未有效并且下一个Section将生效:
PCR_PID:占13位,PCR(节目参考时钟)所在transport packet(TS分组)的PID:
program_info_length:占12位,指定紧跟在program_info_length属性之后的节目描述信息的字节数:
跟在program_info_length属性之后的节目描述信息如下。如果program_info_length的值为0,表示没有节目描述信息:
stream_type:占8位,媒体流的类型,具体流类型参考下面的表格。比如值为0x1B表示是AVC,即H.264视频流;值为0x0F表示是ADTS包装的AAC音频流:
elementary_PID:占13位,该节目的音频或视频PID:
ES_info_length:占12位,ES描述信息的长度,如果值为0表示没有信息:
ES描述信息如下:
三、PMT表实例分析
用Elecard Stream Analyzer工具打开一个TS文件。可以看到其某个PMT表中program_number为1,表示这是一个节目号为“1”的节目:
该节目中有两个媒体流。第一个媒体流stream_type的值为0x1B,表示是H.264视频流,elementary_PID为0x100,所以该节目视频的PID为0x100;第二个媒体流stream_type的值为0x0F,表示是AAC音频流,elementary_PID为0x101,所以该节目音频的PID为0x101;
通过PMT表找到PID为0x100的视频流如下:
通过PMT表找到PID为0x101的音频流如下: