TS流解析(3)

2019-08-30 16:17

PID = 0x0000,表示此TS包的内容为PSI信息表格的PAT表格数据,在4字节的TS包头之后的第一个字节的Point_field = 0x00, 表示偏移量为0,即紧随其后的即为PAT的数据信息

PAT表格定义如下:

typedef struct TS_PAT_Program {

unsigned program_number :16; //节目号

unsigned program_map_PID :13; //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个 }TS_PAT_Program; //PAT表结构体 typedef struct TS_PAT {

unsigned table_id : 8; //固定为0x00 ,标志是该表是PAT unsigned section_syntax_indicator : 1; //段语法标志位,固定为1 unsigned zero : 1; //0

unsigned reserved_1 : 2; // 保留位

unsigned section_length : 12; //表示这个字节后面有用的字节数,包括CRC32

unsigned transport_stream_id : 16; //该传输流的ID,区别于一个网络中其它多路复用的流

unsigned reserved_2 : 2;// 保留位

unsigned version_number : 5; //范围0-31,表示PAT的版本号

unsigned current_next_indicator : 1; //发送的PAT是当前有效还是下一个PAT有效

unsigned section_number : 8; //分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段

unsigned last_section_number : 8; //最后一个分段的号码

std::vector program;

unsigned reserved_3 : 3; // 保留位

unsigned network_PID : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID

unsigned CRC_32 : 32; //CRC32校验码 } TS_PAT;

解析代码如下:

HRESULT CTS_Stream_Parse::adjust_PAT_table( TS_PAT * packet, unsigned char * buffer) {

packet->table_id = buffer[0];

packet->section_syntax_indicator = buffer[1] >> 7; packet->zero = buffer[1] >> 6 & 0x1; packet->reserved_1 = buffer[1] >> 4 & 0x3;

packet->section_length = (buffer[1] & 0x0F) << 8 | buffer[2];

packet->transport_stream_id = buffer[3] << 8 | buffer[4];

packet->reserved_2 = buffer[5] >> 6;

packet->version_number = buffer[5] >> 1 & 0x1F; packet->current_next_indicator = (buffer[5] << 7) >> 7; packet->section_number = buffer[6]; packet->last_section_number = buffer[7]; int len = 0;

len = 3 + packet->section_length;

packet->CRC_32 = (buffer[len-4] & 0x000000FF) << 24 | (buffer[len-3] & 0x000000FF) << 16 | (buffer[len-2] & 0x000000FF) << 8 | (buffer[len-1] & 0x000000FF); int n = 0;

for ( n = 0; n < packet->section_length - 12; n += 4 ) {

unsigned program_num = buffer[8 + n ] << 8 | buffer[9 + n ];

packet->reserved_3 = buffer[10 + n ] >> 5;

packet->network_PID = 0x00; if ( program_num == 0x00) {

packet->network_PID = (buffer[10 + n ] & 0x1F) << 8 | buffer[11 + n ]; TS_network_Pid = packet->network_PID; //记录该TS流的网络PID TRACE(\ } else {

TS_PAT_Program PAT_program;

PAT_program.program_map_PID = (buffer[10 + n] & 0x1F) << 8 | buffer[11 + n]; PAT_program.program_number = program_num; packet->program.push_back( PAT_program );

TS_program.push_back( PAT_program );//向全局PAT节目数组中添加PAT节目信息 } } return 0; }

因此,PAT数据解析结果如下: PAT数据

table_id :0x00 //8 section_syntax_indicator :0x01 // 1 '0' :0x00 // 1 reserved 0x03 // 2 section_length :0x00d // 12 transport_stream_id :0x0000 // 16 reserved :0x03 // 2 version_number :0x00 // 5 current_next_indicator :0x01 // 1

section_number :0x00 // 8 last_section_number :0x00 // 8 program_number :0x0001 // 16 reserved :0x07 // 3 program_map_PID :0x03e8 // 13 CRC :0x f0 0b d7 79

由解析结构可知,该PAT表格中没有网络信息包信息,只包含一个节目,其PID为0x03e8 PMT结构定义:

typedef struct TS_PMT_Stream {

unsigned stream_type : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定

unsigned elementary_PID : 13; //该域指示TS包的PID值。这些TS包含有相关的节目元素

unsigned ES_info_length : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数 unsigned descriptor; }TS_PMT_Stream; //PMT 表结构体 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 PMT_Stream; //每个元素包含8位, 指示特定PID的节目元素包的类型。该处PID由elementary PID指定 unsigned reserved_5 : 3; //0x07 unsigned reserved_6 : 4; //0x0F unsigned CRC_32 : 32; } TS_PMT;

解析代码为:

HRESULT CTS_Stream_Parse::adjust_PMT_table ( TS_PMT * packet, unsigned char * buffer ) {

packet->table_id = buffer[0];

packet->section_syntax_indicator = buffer[1] >> 7; packet->zero = buffer[1] >> 6 & 0x01; packet->reserved_1 = buffer[1] >> 4 & 0x03;

packet->section_length = (buffer[1] & 0x0F) << 8 | buffer[2]; packet->program_number = buffer[3] << 8 | buffer[4]; packet->reserved_2 = buffer[5] >> 6;


TS流解析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:液质联用

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: