一、先复习一下TS流包头结构:
TS包头定义(4个字节):
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; // 四位数据
return 0;
}
二、TS包的组成:

上图:
①由Adaption_field_control=2或者=3决定本包存在Adaption_field字段;
②Adaption_field字段:Adaption_field_length+其他内容,在上图中为05 00 ff ff ff ff; Adaption_field_length=0x05。
③payload_unit_start_indicator==1时有1字节的pointer_field;==0则无pointer_field(PSI/SI表中,表示这张表没有传完,本包继续传输,续帧);
假设为188Byte的TS包,则结构应该是:
4字节包头 + 调整字段Adaption_field + 1字节pointer_field(payload_unit_start_indicator==1时,)+ 数据 data_byte;
1.Adaption_field(调整字段):
if (adaption_field_control == 2 || adaption_field_control == 3)
{
adaption_fields() //调整字段的处理:当 PCR_flag=1,则表示本调整字段包含PCR包,可用于统计并计算码率
}
else //==0或者1
{
data_byte()
}
三、含PCR的包的参考图:

14:24 2021/01/15
2389

被折叠的 条评论
为什么被折叠?



