ImageVerifierCode 换一换
格式:DOC , 页数:6 ,大小:40.50KB ,
资源ID:7671425      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7671425.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(关于TS流的解析.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

关于TS流的解析.doc

1、关于TS流的解析 TS即是"Transport Stream"的缩写。他是分包发送的,每一个包长为188字节。在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据,有一些可能为填充数据)。 工作形式: 因为在TS流里可以填入很多种东西,所以有必要有一种机制来确定怎么来标识这些数据。制定TS流标准的机构就规定了一些数据结构来定义。比如: PSI(Program Specific Information)表,所以解析起来就像这样: 先接收一个负载里为PAT的数据包,在整个数据包里找到一个PMT包的

2、ID。然后再接收一个含有PMT的数据包,在这个数据包里找到有关填入数据类型的ID。之后就在接收到的TS包里找含有这个ID的负载内容,这个内容就是填入的信息。根据填入的数据类型的ID的不同,在TS流复合多种信息是可行的。关键就是找到标识的ID号。 现在以一个例子来说明具体的操作: 在开始之前先给出一片实际TS流例子: 0000f32ch: 47 40 00 17 00 00 B0 0D 00 01 C1 00 00 00 01 E0 ; G@....?..?...? 0000f33ch: 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF FF FF

3、  ⒚)A 0000f34ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f35ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f36ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f37ch: FF FF FF FF FF FF FF FF FF FF FF

4、FF FF FF FF FF ;  0000f38ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f39ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f3ach: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f3bch: FF FF FF FF FF FF

5、 FF FF FF FF FF FF FF FF FF FF ;  0000f3cch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;  0000f3dch: FF FF FF FF FF FF FF FF FF FF FF FF 47 40 20 17 ; G@ . 0000f3ech: 00 02 B0 1B 00 01 C1 00 00 E0 21 F0 00 1B E0 21 ; ..?..?.??.? 0000f3fch: F0 04

6、2A 02 7E 1F 03 E0 22 F0 00 5D 16 BD 48    ; ?*.~..??].紿 具体的分析就以这个例子来分析。 // Adjust TS packet header void adjust_TS_packet_header(TS_packet_header* pheader) {     unsigned char buf[4];     memcpy(buf, pheader, 4);     pheader->transport_error_indicator        = buf[1] >> 7;     pheader->paylo

7、ad_unit_start_indicator    = buf[1] >> 6 & 0x01;     pheader->transport_priority                = buf[1] >> 5 & 0x01;     pheader->PID                            = (buf[1] & 0x1F) << 8 | buf[2];     pheader->transport_scrambling_control    = buf[3] >> 6;     pheader->adaption_field_control      

8、      = buf[3] >> 4 & 0x03;     pheader->continuity_counter                = buf[3] & 0x03; } 这是一个调整TS流数据包头的函数,这里牵扯到位段调整的问题。现在看一下TS流数据包头的结构的定义: // Transport packet header typedef struct TS_packet_header {     unsigned sync_byte                        : 8;     unsigned transport_error_indica

9、tor        : 1;     unsigned payload_unit_start_indicator    : 1;     unsigned transport_priority                : 1;     unsigned PID                            : 13;     unsigned transport_scrambling_control    : 2;     unsigned adaption_field_control            : 2;     unsigned continuity_

10、counter                : 4; } TS_packet_header; 下面我们来分析,在ISO/IEC 13818-1里有说明,PAT(Program Association Table)的PID值为0x00,TS包的标识(即sync_byte)为0x47,并且为了确保这个TS包里的数据有效,所以我们一开始查找47 40 00这三组16进制数,为什么这样?具体的奥秘在TS包的结构上,前面已经说了sync_byte固定为0x47。现在往下看transport_error_indicator、payload_unit_start_indicator、transpor

11、t_priority和PID这四个元素,PID为0x00,这是PAT的标识。transport_error_indicator为0,transport_priority为0。把他们看成是两组8位16进制数就是:40 00。现在看看我们的TS流片断例子,看来正好是47 40 00开头的,一个TS流的头部占据了4个字节。剩下的负载部分的内容由PID来决定,例子看来就是一个PAT表。在这里有个地方需要注意一下,payload_unit_start_indicator为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置。现在看例子中的数据47 40 00 17 00第五个字节

12、是00,说明紧跟着00之后就是具体的负载内容。 下面给出PAT表的结构体: // PAT table // Programm Association Table typedef struct TS_PAT {     unsigned table_id                        : 8;     unsigned section_syntax_indicator        : 1;     unsigned zero                            : 1;     unsigned reserved_1             

13、           : 2;     unsigned section_length                    : 12;     unsigned transport_stream_id            : 16;     unsigned reserved_2                        : 2;     unsigned version_number                    : 5;     unsigned current_next_indicator            : 1;     unsigned sectio

14、n_number                    : 8;     unsigned last_section_number            : 8;     unsigned program_number                    : 16;     unsigned reserved_3                        : 3;     unsigned network_PID                    : 13;     unsigned program_map_PID                : 13;     u

15、nsigned CRC_32                            : 32; } TS_PAT; 再给出PAT表字段调整函数: // Adjust PAT table void adjust_PAT_table ( TS_PAT * packet, char * buffer ) {     int n = 0, i = 0;     int len = 0;     packet->table_id                    = buffer[0];     packet->section_syntax_indicator    = buf

16、fer[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

17、[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         

18、   = buffer[7];     // Get CRC_32     len = 3 + packet->section_length;     packet->CRC_32                        = (buffer[len-4] & 0x000000FF) << 24                                           | (buffer[len-3] & 0x000000FF) << 16                                           | (buffer[len-2] & 0x0

19、00000FF) << 8                                           | (buffer[len-1] & 0x000000FF);     // Parse network_PID or program_map_PID     for ( n = 0; n < packet->section_length - 4; n ++ )     {         packet->program_number            = buffer[8] << 8 | buffer[9];         packet->reserved_3

20、                = buffer[10] >> 5;         if ( packet->program_number == 0x0 )             packet->network_PID = (buffer[10] << 3) << 5 | buffer[11];         else         {             packet->program_map_PID = (buffer[10] << 3) << 5 | buffer[11];         }         n += 5;     } } 通过上

21、面的分析,例子中的数据00 B0 0D 00 01 C1 00 00 00 01 E0 20 A2 C3 29 41就是具体的PAT表的内容,然后根据PAT结构体来具体分析PAT表。但是我们需要注意的是在PAT表里有program_number、network_PID的元素不只有一个,这两个元素是通过循环来确定的。循环的次数通过section_length元素的确定。在这个例子中program_map_PID为20,所以下面来PMT分析时,就是查找47 40 20的开头的TS包。 下面来分析PMT表,先给出PMT(Program Map Table)的结构体: // PMT table

22、// Program Map Table typedef struct TS_PMT {     unsigned table_id                        : 8;     unsigned section_syntax_indicator        : 1;     unsigned zero                            : 1;     unsigned reserved_1                        : 2;     unsigned section_length                   

23、 : 12;     unsigned program_number                    : 16;     unsigned reserved_2                        : 2;     unsigned version_number                    : 5;     unsigned current_next_indicator            : 1;     unsigned section_number                    : 8;     unsigned last_section_

24、number            : 8;     unsigned reserved_3                        : 3;     unsigned PCR_PID                        : 13;     unsigned reserved_4                        : 4;     unsigned program_info_length            : 12;         unsigned stream_type                    : 8;     unsigned

25、 reserved_5                        : 3;     unsigned elementary_PID                    : 13;     unsigned reserved_6                        : 4;     unsigned ES_info_length                    : 12;     unsigned CRC_32                            : 32; } TS_PMT; 在给出调整字段函数: // Adjust PMT tabl

26、e void adjust_PMT_table ( TS_PMT * packet, char * buffer ) {     int pos = 12, len = 0;     int i = 0;     packet->table_id                            = buffer[0];     packet->section_syntax_indicator            = buffer[1] >> 7;     packet->zero                                = buffer[1] >>

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

28、 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];

29、    packet->reserved_3                            = buffer[8] >> 5;     packet->PCR_PID                                = ((buffer[8] << 8) | buffer[9]) & 0x1FFF;     packet->reserved_4                            = buffer[10] >> 4;     packet->program_info_length                    = (buffer[10] &

30、 0x0F) << 8 | buffer[11];     // Get CRC_32     len = packet->section_length + 3;        packet->CRC_32                = (buffer[len-4] & 0x000000FF) << 24                                   | (buffer[len-3] & 0x000000FF) << 16                                   | (buffer[len-2] & 0x000000FF) <

31、< 8                                   | (buffer[len-1] & 0x000000FF);     // program info descriptor     if ( packet->program_info_length != 0 )         pos += packet->program_info_length;        // Get stream type and PID        for ( ; pos <= (packet->section_length + 2 ) -  4; )     {

32、        packet->stream_type                            = buffer[pos];         packet->reserved_5                            = buffer[pos+1] >> 5;         packet->elementary_PID                        = ((buffer[pos+1] << 8) | buffer[pos+2]) & 0x1FFF;         packet->reserved_6                    

33、        = buffer[pos+3] >> 4;         packet->ES_info_length                        = (buffer[pos+3] & 0x0F) << 8 | buffer[pos+4];         // Store in es         es[i].type = packet->stream_type;         es[i].pid = packet->elementary_PID;         if ( packet->ES_info_length != 0 )         {

34、             pos = pos+5;             pos += packet->ES_info_length;         }         else         {             pos += 5;         }         i++;     } } TS流可以复合很多的节目的视频和音频,但是解码器是怎么来区分的呢?答案就在PMT表里,如其名节目映射表。他就是来解决这个问题的。现在看PMT结构体里的stream_type、elementary_PID这两个元素,前一个用来确定后一个作为标识PID的内容具体是什么,音频或视频等。还有要注意他们不只有一个,所以他们是通过循环读取来确保所有的值都被读取了,当然循环也是有规定的(具体看调整函数上)。从例子上来看,我们在倒数第三行找到了上面分析来的PMT表的PID为0x20的TS包。然后就可以把数据是用调整函数填入结构中。然后得到具体节目的PID为视频0x21, 音频0x22。 PS. 文章里的PID是用来判断具体TS包是什么包的。分析每个包得到的PID值,都可以复合在TS头部结构体的PID里。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服