TS流解析(2)

2019-08-30 16:17

payload_unit_start_indicator 这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。

transport_priority 传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。 PID 这个比较重要,指出了这个包的有效负载数据的类型,告诉我们这个包传输的是什么内容。前面已经叙述过。

transport_scrambling_control 加密标志位,表示TS分组有效负载的加密模式。TS分组首部(也就是前面这32bit)是不应被加密的,00表示未加密。

adaption_field_control 翻译为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00的话解码器不进行处理。空分组没有调整字段

continuity_counter 一个4bit的计数器,范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。如下:(1)TS分组无有效负载(2)复制的TS分组和原分组这个值一样(3)后面讲到的一个标志discontinuity_indicator为1时 adaptation_field() 调整字段的处理

data_byte 有效负载的剩余部分,可能为PES分组,PSI,或一些自定义的数据。

(2) PAT数据结构如下: program_association_section() { table_id // 8 section_syntax_indicator // 1 '0' // 1 reserved // 2 section_length // 12 transport_stream_id // 16 reserved // 2 version_number // 5 current_next_indicator // 1 section_number // 8 last_section_number // 8 for (i=0; i

program_number // 16 reserved // 3 if(program_number == '0') {

network_PID // 13 }

else {

program_map_PID // 13 } }

CRC_32 // 32 }

table_id 固定为0x00 ,标志是该表是PAT section_syntax_indicator 段语法标志位,固定为1

section_length 表示这个字节后面有用的字节数,包括CRC32。假如后面的字节加上前面的字节数少于188,后面会用0XFF填充。假如这个数值比较大,则PAT会分成几部分来传输。

transport_stream_id 该传输流的ID,区别于一个网络中其它多路复用的流。

version_number范围0-31,表示PAT的版本号,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.

current_next_indicator 表示发送的PAT是当前有效还是下一个PAT有效。

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

last_section_number 最后一个分段的号码 program_number 节目号

network_PID 网络信息表(NIT)的PID,网络信息表提供了该物理网络的一些信息,和电视台相关的。节目号为0时对应的PID为network_PID

program_map_PID 节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个 CRC_32 CRC32校验码

上面program_number,network_PID,program_map_PID 是循环出现的。program_number等于0时对应network_PID,program_number等于其它值时对应program_map_PID。

(3)PMT PMT数据结构如下: TS_program_map_section() { table_id // 8 section_syntax_indicator // 1 '0' // 1 reserved // 2

section_length // 12 program_number // 16 reserved // 2 version_number // 5 current_next_indicator // 1 section_number // 8 last_section_number // 8 reserved // 3 PCR_PID // 13 reserved 4

program_info_length // 12 for (i=0; i

for (i=0;i

stream_type // 8 reserved // 3 elementary_PID // 13 reserved // 4 ES_info_length // 12 for (i=0; i

CRC_32 // 32 }

table_id 固定为0x02 ,标志是该表是PMT。

section_syntax_indicator section_length version_number current_next_indicator 以上四个字段意思和PAT相同,可参考上面解释

section_number last_section_number 以上两个字段意思和PAT相同,不过值都固定为0x00,我觉得这样的原因可能是因为PMT不需要有先后顺序,因为先定义哪个节目都是无所谓。

program_number 节目号,表示该PMT对应的节目

PCR_PID PCR(节目时钟参考)所在TS分组的PID,根据PID可以去搜索相应的TS分组,解出PCR信息。

program_info_length 该节目的信息长度,在此字段之后可能会有一些字节描述该节目的信息

stream_type 指示了PID为elementary_PID的PES分组中原始流的类型,比如视频流,音频流等,见后面的表

elementary_PID 该节目中包括的视频流,音频流等对应的TS分组的PID ES_info_length 该节目相关原始流的描述符的信息长度。

根据前一篇中各数据的定义及数据结构,对数据进行分别解析如下: TS包头定义:

typedef struct TS_packet_header {

unsigned sync_byte : 8; //同步字节, 固定为0x47,表示后面的是一个TS分组

unsigned transport_error_indicator : 1; //传输误码指示符

unsigned payload_unit_start_indicator : 1; //有效荷载单元起始指示符

unsigned transport_priority : 1; //传输优先, 1表示高优先级,传输机制可能用到,解码用不着

unsigned PID : 13; //PID

unsigned transport_scrambling_control : 2; //传输加扰控制

unsigned adaption_field_control : 2; //自适应控制 01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00解码器不进行处理

unsigned continuity_counter : 4; //连续计数器 一个4bit的计数器,范围0-15 } TS_packet_header;

TS包头解析代码:

HRESULT CTS_Stream_Parse::adjust_TS_packet_header( TS_packet_header* TS_header ) {

unsigned char buf[4];

memcpy(buf, TS_header, 4);

TS_header->transport_error_indicator = buf[1] >> 7; TS_header->payload_unit_start_indicator = buf[1] >> 6 & 0x01; TS_header->transport_priority = buf[1] >> 5 & 0x01; TS_header->PID = (buf[1] & 0x1F) << 8 | buf[2]; TS_header->transport_scrambling_control = buf[3] >> 6; TS_header->adaption_field_control = buf[3] >> 4 & 0x03;

TS_header->continuity_counter = buf[3] & 0x0F; // 四位数据,应为0x0F xyy 09.03.18 return 0; }

如下为一个TS包数据:

0x47 0x40 0x00 0x12 0x00 0x00 0xb0 0x0d 0x00 0x00 0xc1 0x00 0x00 0x00 0x01 0xe3 0xe8 0xf0 0x0b 0xd7 0x79 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

分析知道前四位0x47 0x40 0x00 0x12TS头部即为TS包头数据,解析如下: sync_byte :0x47

transport_error_indicator: 0x00 payload_unit_start_indicator: 0x01 transport_priority : 0x00 PID :0x0000 transport_scrambling_control :0x00

adaptation_field_control :0x01 continuity_counter :0x02


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

下一篇:液质联用

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

马上注册会员

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