TS流的解析三篇Word文件下载.docx
《TS流的解析三篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《TS流的解析三篇Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
关键就是找到标识的ID号。
现在以一个例子来说明具体的操作:
在开始之前先给出一片实际TS流例子:
0000f32ch:
474000170000B00D0001C100000001E0;
0000f33ch:
20A2C32941FFFFFFFFFFFFFFFFFFFFFF;
0000f34ch:
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
0000f35ch:
0000f36ch:
0000f37ch:
0000f38ch:
0000f39ch:
0000f3ach:
0000f3bch:
0000f3cch:
0000f3dch:
FFFFFFFFFFFFFFFFFFFFFFFF474020XX;
G@.
0000f3ech:
0002B01B0001C10000E021F0001BE021;
0000f3fch:
F0042A027E1F03E022F0005D16BD48
具体的分析就以这个例子来分析。
//AdjustTSpacketheader
voidadjust_TS_packet_header(TS_packet_header*pheader)
{
unsignedcharbuf[4];
memcpy(buf,pheader,4);
pheader->
transport_error_indicator
=buf[1]>
>
7;
payload_unit_start_indicator
6&
0x01;
transport_priority
5&
PID
=(buf[1]&
0x1F)<
<
8|buf[2];
transport_scrambling_control
=buf[3]>
6;
adaption_field_control
4&
0x03;
continuity_counter
=buf[3]&
}
这是一个调整TS流数据包头的函数,这里牵扯到位段调整的问题。
现在看一下TS流数据包头的结构的定义:
//Transportpacketheader
typedefstructTS_packet_header
unsignedsync_byte
:
8;
unsignedtransport_error_indicator
1;
unsignedpayload_unit_start_indicator
unsignedtransport_priority
unsignedPID
13;
unsignedtransport_scrambling_control
2;
unsignedadaption_field_control
unsignedcontinuity_counter
4;
}TS_packet_header;
下面我们来分析,在ISO/IEC13818-1里有说明,PAT(ProgramAssociationTable)的PID值为0x00,TS包的标识(即sync_byte)为0x47,并且为了确保这个TS包里的数据有效,所以我们一开始查找474000这三组16进制数,为什么这样?
具体的奥秘在TS包的结构上,前面已经说了sync_byte固定为0x47。
现在往下看transport_error_indicator、payload_unit_start_indicator、transport_priority和PID这四个元素,PID为0x00,这是PAT的标识。
transport_error_indicator为0,transport_priority为0。
把他们看成是两组8位16进制数就是:
4000。
现在看看我们的TS流片断例子,看来正好是474000开头的,一个TS流的头部占据了4个字节。
剩下的负载部分的内容由PID来决定,例子看来就是一个PAT表。
在这里有个地方需要注意一下,payload_unit_start_indicator为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置。
现在看例子中的数据4740001700第五个字节是00,说明紧跟着00之后就是具体的负载内容。
下面给出PAT表的结构体:
//PATtable
//ProgrammAssociationTable
typedefstructTS_PAT
unsignedtable_id
unsignedsection_syntax_indicator
unsignedzero
unsignedreserved_1
unsignedsection_length
12;
unsignedtransport_stream_id
16;
unsignedreserved_2
unsignedversion_number
5;
unsignedcurrent_next_indicator
unsignedsection_number
unsignedlast_section_number
unsignedprogram_number
unsignedreserved_3
3;
unsignednetwork_PID
unsignedprogram_map_PID
unsignedCRC_32
32;
}TS_PAT;
再给出PAT表字段调整函数:
//AdjustPATtable
voidadjust_PAT_table(TS_PAT*packet,char*buffer)
intn=0,i=0;
intlen=0;
packet->
table_id
=buffer[0];
section_syntax_indicator
=buffer[1]>
zero
0x1;
reserved_1
0x3;
section_length
=(buffer[1]&
0x0F)<
8|buffer[2];
transport_stream_id
=buffer[3]<
8|buffer[4];
reserved_2
=buffer[5]>
version_number
1&
0x1F;
current_next_indicator
=(buffer[5]<
7)>
section_number
=buffer[6];
last_section_number
=buffer[7];
//GetCRC_32
len=3+packet->
section_length;
CRC_32
=(buffer[len-4]&
0x000000FF)<
24
|(buffer[len-3]&
16
|(buffer[len-2]&
8
|(buffer[len-1]&
0x000000FF);
//Parsenetwork_PIDorprogram_map_PID
for(n=0;
n<
section_length-4;
n++)
program_number
=buffer[8]<
8|buffer[9];
reserved_3
=buffer[10]>
if(packet->
program_number==0x0)