1.概要
PMT:节目映射表,与PAT成对出现,包含了该节目下所有的节目元素。
PMT数据结构如下:
字段分析:
字段 | 字段描述 |
---|---|
表id | 标识一个TS PSI分段的内容是节目关联分段,条件访问分段还是节目映射分段。对于PMT置为0x02。 |
段语法标志位 | 固定为1 |
0 | 固定为0 |
保留位 | 固定为0x3(每一位都是1) |
分段长度 | 自分段长度字段(不包括分段长度)后直到CRC32字段的字节数,头两位应为00 |
节目编号 | 定义的该PMT节目的编号与PAT的节目标号对应上 |
保留位 | 固定为0x3 |
版本号 | 指示符 设置为‘1’时,版本号 必须为当前有效的节目相关表的版本号。指示符 设置为‘0’时,版本号 为下一个有效的节目相关表的版本号。注:版本号将随着此分段中内容的每一次变化而加1,达到31又回复到0; |
指示符 | 1:发送的节目相关表为当前有效的。0:发送的该表尚未有效并且下一个表将生效。 |
分段号 | 固定值为00 |
最后一个分段号 | 固定值为00 |
保留位 | 固定位0x7 |
PID | 节目元素的pid值,就是视频流或者音频流的PID值 |
保留位 | 0xF |
节目描述信息长度 | 描述信息的长度,头两位应为00,没有描述信息设置为0即可,描述信息紧跟在该字段后面,一般设置为0,表示没有描述信息,视情况而定 |
节目元素单 | 媒体流的信息 |
CRC32 | crc校验 |
节目元素单:
字段 | 字段描述 |
---|---|
流类型 | 媒体流的类型,具体流类型参考下面的表格 |
保留位 | 0x7 |
元素PID | TS包的PID,通过该PID找到流媒体包 |
保留位 | 0xF |
ES信息长度 | ES描述信息的长度,紧跟在该字段后面,一般设置为0表示没有信息 |
基本流媒体类型:参考:节目专用信息
Decimal | Hexadecimal | Description |
---|---|---|
0 | 0x00 | Reserved |
1 | 0x01 | ISO/IEC 11172-2 (MPEG-1 video)in a packetized stream |
2 | 0x02 | ITU-T Rec. H.262 and ISO/IEC 13818-2 (MPEG-2 higher rate interlaced video)in a packetized stream |
3 | 0x03 | ISO/IEC 11172-3 (MPEG-1 audio)in a packetized stream |
4 | 0x04 | ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)in a packetized stream |
5 | 0x05 | ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 tabled data)privately defined |
6 | 0x06 | ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 packetized data)privately defined (i.e., DVB subtitles/VBI and AC-3) |
7 | 0x07 | ISO/IEC 13522 (MHEG)in a packetized stream |
8 | 0x08 | ITU-T Rec. H.222 and ISO/IEC 13818-1DSM CCin a packetized stream |
9 | 0x09 | ITU-T Rec. H.222 and ISO/IEC 13818-1/11172-1 auxiliary datain a packetized stream |
10 | 0x0A | ISO/IEC 13818-6DSM CCmultiprotocol encapsulation |
11 | 0x0B | ISO/IEC 13818-6DSM CCU-N messages |
12 | 0x0C | ISO/IEC 13818-6DSM CCstream descriptors |
13 | 0x0D | ISO/IEC 13818-6DSM CCtabled data |
14 | 0x0E | ISO/IEC 13818-1 auxiliary datain a packetized stream |
15 | 0x0F | ISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio)in a packetized stream |
16 | 0x10 | ISO/IEC 14496-2 (MPEG-4 H.263 based video)in a packetized stream |
17 | 0x11 | ISO/IEC 14496-3 (MPEG-4 LOAS multi-format framed audio)in a packetized stream |
18 | 0x12 | ISO/IEC 14496-1 (MPEG-4 FlexMux)in a packetized stream |
19 | 0x13 | ISO/IEC 14496-1 (MPEG-4 FlexMux)in ISO/IEC 14496 tables |
20 | 0x14 | ISO/IEC 13818-6DSM CCsynchronized download protocol |
21 | 0x15 | Packetized metadata |
22 | 0x16 | Sectioned metadata |
23 | 0x17 | ISO/IEC 13818-6DSM CCData Carousel metadata |
24 | 0x18 | ISO/IEC 13818-6DSM CCObject Carousel metadata |
25 | 0x19 | ISO/IEC 13818-6 Synchronized Download Protocol metadata |
26 | 0x1A | ISO/IEC 13818-11 IPMP |
27 | 0x1B | ITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video)in a packetized stream |
28 | 0x1C | ISO/IEC 14496-3 (MPEG-4 raw audio)in a packetized stream |
29 | 0x1D | ISO/IEC 14496-17 (MPEG-4 text)in a packetized stream |
30 | 0x1E | ISO/IEC 23002-3 (MPEG-4 auxiliary video)in a packetized stream |
31 | 0x1F | ISO/IEC 14496-10 SVC (MPEG-4 AVC sub-bitstream)in a packetized stream |
32 | 0x20 | ISO/IEC 14496-10 MVC (MPEG-4 AVC sub-bitstream)in a packetized stream |
33 | 0x21 | ITU-T Rec. T.800 and ISO/IEC 15444 (JPEG 2000 video)in a packetized stream |
34 - 35 | 0x22 - 0x23 | Reserved. |
36 | 0x24 | ITU-T Rec. H.265 and ISO/IEC 23008-2 (Ultra HD video)in a packetized stream |
37 - 65 | 0x25 - 0x41 | Reserved. |
66 | 0x42 | Chinese Video Standardin a packetized stream |
67 - 126 | 0x43 - 0x7e | Reserved. |
127 | 0x7f | ISO/IEC 13818-11 IPMP (DRM)in a packetized stream |
128 | 0x80 | ITU-T Rec. H.262 and ISO/IEC 13818-2 with DES-64-CBC encryption for DigiCipher IIor PCM audio forBlu-rayin a packetized stream |
129 | 0x81 | Dolby Digital (AC-3) up to six channel audio for ATSC andBlu-rayin a packetized stream |
130 | 0x82 | SCTEsubtitleorDTS6 channel audio forBlu-rayin a packetized stream |
131 | 0x83 | Dolby TrueHDlossless audio forBlu-rayin a packetized stream |
132 | 0x84 | Dolby Digital Plus(enhanced AC-3) up to 16 channel audio forBlu-rayin a packetized stream |
133 | 0x85 | DTS8 channel audio forBlu-rayin a packetized stream |
134 | 0x86 | SCTE-35[5]digital program insertion cue messageorDTS8 channel lossless audio forBlu-rayin a packetized stream |
135 | 0x87 | Dolby Digital Plus(enhanced AC-3) up to 16 channel audio for ATSCin a packetized stream |
136 - 143 | 0x88 - 0x8F | Privately defined. |
144 | 0x90 | Blu-rayPresentation Graphic Stream(subtitling)in a packetized stream |
145 | 0x91 | ATSCDSM CCNetwork Resources table |
146 - 191 | 0x92 - 0xBF | Privately defined. |
192 | 0xC0 | DigiCipher II textin a packetized stream |
193 | 0xC1 | Dolby Digital (AC-3) up to six channel audio with AES-128-CBC data encryptionin a packetized stream |
194 | 0xC2 | ATSCDSM CCsynchronous dataor Dolby Digital Plus up to 16 channel audio with AES-128-CBC data encryptionin a packetized stream |
195 - 206 | 0xC3 - 0xCE | Privately defined. |
207 | 0xCF | ISO/IEC 13818-7 ADTS AAC with AES-128-CBC frame encryptionin a packetized stream |
208 | 0xD0 | Privately defined. |
209 | 0xD1 | BBCDirac(Ultra HD video)in a packetized stream |
210 | 0xD2 | Audio Video StandardAVS2 (Ultra HD video)in a packetized stream |
211 | 0xD3 | Audio Video StandardAVS3 Audioin a packetized stream |
212 | 0xD4 | Audio Video StandardAVS3 Video (Ultra HD video)in a packetized stream |
213 - 218 | 0xD5 - 0xDA | Privately defined. |
219 | 0xDB | ITU-T Rec. H.264 and ISO/IEC 14496-10 with AES-128-CBC slice encryptionin a packetized stream |
220 - 233 | 0xDC - 0xE9 | Privately defined. |
234 | 0xEA | MicrosoftWindows Media Video9 (lower bit-rate video)in a packetized stream |
235 - 255 | 0xEB - 0xFF | Privately defined. |
常用的流类型有:H2.64:0x1B; H2.65:0x24; AAC:0xF ,自己测试应该不区分大小写;
2.实例代码
typedef struct TS_PMT_Stream
{
unsigned stream_type : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定
unsigned reserved_5 :3;
unsigned elementary_PID : 13; //该域指示TS包的PID值。这些TS包含有相关的节目元素
unsigned reserved_6 :4;
unsigned ES_info_length : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数
}TS_PMT_Stream;
typedef struct TS_PMT
{
unsigned table_id : 8; //固定为0x02, 表示PMT表
unsigned section_syntax_indicator : 1; //固定为0x01
unsigned zero : 1; //0x01
unsigned reserved_1 : 2; //0x03
unsigned section_length : 12;//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC
unsigned program_number : 16;// 指出该节目对应于可应用的Program map PID
unsigned reserved_2 : 2; //0x03
unsigned version_number : 5; //指出TS流中Program map section的版本号
unsigned current_next_indicator : 1; //当该位置1时,当前传送的Program map section可用
//当该位置0时,指示当前传送的Program map section不可用,下一个TS流的Program map section有效
unsigned section_number : 8; //固定为0x00
unsigned last_section_number : 8; //固定为0x00
unsigned reserved_3 : 3; //0x07
unsigned PCR_PID : 13; //指明TS包的PID值,该TS包含有PCR域,
//该PCR值对应于由节目号指定的对应节目,如果对于私有数据流的节目定义与PCR无关,这个域的值将为0x1FFF。
unsigned reserved_4 : 4; //预留为0x0F
unsigned program_info_length : 12; //前两位bit为00。该域指出跟随其后对节目信息的描述的byte数。
std::vector<TS_PMT_Stream> PMT_Stream; //每个元素包含8位, 指示特定PID的节目元素包的类型。该处PID由elementary PID指定
unsigned CRC_32 : 32;
} TS_PMT;
由代码可以看出节目元素表为:std::vector PMT_Stream;是一个容器,里面包含了该节目需要的所有媒体流:音频流,视频流,字幕流等。因此一般情况下,一个PMT里面由两个TS_PMT_Stream代表两种流(视频流,音频流),通过TS_PMT_Stream里的元素PID来获取TS协议中的流媒体数据。
封装代码如下:
TS_PMT set_pmt_pack;
TS_PMT_Stream pmt_stream;
set_pmt_pack.PMT_Stream.clear();
//封装视频流信息
pmt_stream.stream_type = 0x1b;
pmt_stream.reserved_5 = 0x7;
pmt_stream.elementary_PID = 0x100;
pmt_stream.reserved_6 = 0xf;
pmt_stream.ES_info_length = 0x0;
set_pmt_pack.PMT_Stream.push_back(pmt_stream);
//封装音频流信息
pmt_stream.stream_type = 0xf;
pmt_stream.reserved_5 = 0x7;
pmt_stream.elementary_PID = 0x101;
pmt_stream.reserved_6 = 0xf;
pmt_stream.ES_info_length = 0x0;
set_pmt_pack.PMT_Stream.push_back(pmt_stream);
pat_pack.MakeTable(crc32Table);//生成crc32表
set_pmt_pack.table_id = 0x2;
set_pmt_pack.section_syntax_indicator = 0x1;
set_pmt_pack.zero = 0x0;
set_pmt_pack.reserved_1 = 0x3;
set_pmt_pack.section_length = (0xd+set_pmt_pack.PMT_Stream.size()*5);
set_pmt_pack.program_number = 0x0001;//频道号,表示当前的PMT关联到得频道
set_pmt_pack.reserved_2 = 0x3;
set_pmt_pack.version_number = 0;
set_pmt_pack.current_next_indicator = 0x1;
set_pmt_pack.section_number = 0;
set_pmt_pack.last_section_number = 0;
set_pmt_pack.reserved_3 = 0x7;
set_pmt_pack.PCR_PID = 0x100;
set_pmt_pack.reserved_4 = 0xf;
set_pmt_pack.program_info_length = 0x0;
3. 扩展
上述代码都是不带节目描述信息和ES描述信息的,如果想带描述信息,按照官网资料如下:
program_info_length:节目描述信息长度,描述信息就跟在该字段后面;
ES_info_length:ES描述信息长度,描述信息就跟在该字段后面;
下面看一下官网定义的描述信息结构:
描述类型:
视频流描述信息:
字段分析:
字段 | 字段描述 |
---|---|
descriptor_tag | 描述类型,参考图I-2-39 |
descriptor_length | 描述字节个数 |
muitiple_frame_rate_flag | 1bit,为1标识视频流可能出现多种帧速率,为0表示只有一种帧速率 |
frame_rate_code | 4bit,除在muitiple_frame_rate_flag为1时所指示的特殊帧率外,也可以在视频流中出现一些其他帧率 |
MPEG_2_flagMPEG_2_flag | 1bit;0:视频流中含有H2.62或ISO 13818数据,1:视频流只含有ISO 11172-2数据 |
stile_picture_flag | still_picture_flag = 1:表示视频流仅包含静止图片。still_picture_flag = 0:表示视频流可能包含运动或静止图像数据。 |
profile_and_level_indication | 指明profile和leve |
chroma_format | 采样格式,比如01表示4:2:0。 |
frame_rate_extension_flag | frame_rate_extension_flag = 1时在 ITU-T Rec. H.262 或ISO/IEC 13818-2视屏流中,frame_rate_extension_n、frame_rate_extension_d都是非零值 |
无论frame_rate_extension_flag为何值ISO/IEC 11172-2视频流的两个字段均设置为零。 |
| Reserved | 保留位,固定为11111(每一位都是1,占5 bit所以是11111)。 |
音频流描述信息:
字段分析:
字段 | 字段分析 |
---|---|
descriptor_tag | 描述类型,参考图I-2-39 |
descriptor_length | 描述字节个数 |
free_format_flag | free_format_flag = 1:表示音频流可能包含一个或多个bitrate_index设置为“0000”的音频帧。 |
free_format_flag = 0:则在音频流的任何音频帧中,bitrate_index都不是“0000”(参考ISO/IEC 13818-3的2.4.2.3)。 | |
ID | ID = 1:表示在音频流中的每个音频帧中ID字段设置为“0”(参见ISO/IEC 13818-3的2.4.2.3)。 |
layer | 与层字段相同的方式编码。此字段中指示的层应等于或高于音频流的任何音频帧中指定的最高层。 |
variable_rate_audio_indicator | variable_rate_audio_indicator = 0:表示比特率字段的编码值在连续音频帧中不应改变,该连续音频帧旨在无中断地呈现。 |
reserved | 保留位,固定为111(每一位都是1,占3 bit所以是111)。 |
N,N1,N2官网并未说明,个人认为:
一般情况下,N和N1是相等的,都等于媒体流的数量,假如该PMT中含有音频流,视频流,字幕流三种流的PID,则N和N1就等于3;而N中的descriptor()就包含了音频流,视频流,字幕流三种流的描述。
而N2是在N1内部,只能代表一种媒体流,要么音频,要么视频,所以N2一般情况下为1.