TS流的解析三篇Word文件下载.docx

上传人:b****4 文档编号:13542845 上传时间:2022-10-11 格式:DOCX 页数:27 大小:24.81KB
下载 相关 举报
TS流的解析三篇Word文件下载.docx_第1页
第1页 / 共27页
TS流的解析三篇Word文件下载.docx_第2页
第2页 / 共27页
TS流的解析三篇Word文件下载.docx_第3页
第3页 / 共27页
TS流的解析三篇Word文件下载.docx_第4页
第4页 / 共27页
TS流的解析三篇Word文件下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

TS流的解析三篇Word文件下载.docx

《TS流的解析三篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《TS流的解析三篇Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。

TS流的解析三篇Word文件下载.docx

关键就是找到标识的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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1