`
wx1569618008
  • 浏览: 75321 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Ts流解析中难点说明

 
阅读更多

1. 对于Ts流的解析网上博客较多,但是核心和难点字段讲的并不深入。本文将讨论Ts解析的几个关键词(或者说不好理解的难点):

  • adaption_field_control,
  • payload_unit_start_indicator,
  • continuity_counter ,
  • transport_error_indicatorl,
  • pointer_field

对于包的解析我们应该首先明确的是一下几种可能:

  • 这里是列表文本 TS包按功能分为链接头,适配域,净荷。
  • 链接头的长度固定,4个字节
  • 适配域的长度从0字节到184字节可变,可以没有,也可以扩展到整个TS包
  • 净荷数据的长度从0字节到184字节可变。
  • 整个TS流是由许多长度为188字节的TS包周期性的排列而形成的。
  • 链接头包含4个字节的内容,主要负责TS包的同步、各种ES流的表示、TS包传输差错的检测和条件接收等功能。

2.payload_unit_start_indicator 标志PES包头以及包含节目特定信息的表(PMT,PAT)的头是否出现在该包中,在失步后的重 新同步中起着重要的作用。

要说明的是一个Ts包往往是放不下一个PES包的,那就需要截取发送,那么截取出来的包中,肯定有的是含有包头的,但是有的是不含有包头的 这个区分是靠这个字段的。所以在解析的时候,如果他置1,那么他后面的就是一个包头,既然是包头,那就可以进一步的解析。因为包头中含有信息。

3.transport_error_indicator(传输错误指示):‘1’表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。

4.Ts解析为ES代码的编写流程。

  1. 这里是列表文本1.首先应该通过adaption_field_control 调整字段来确认,有没有调整字段,有跳过(获取调整字段里面的length),在确认了调整字段后我就指针已经指向了有效负荷区。
    

输入图片说明 ![输入图片说明

2 .通过前面的payload_unit_start_indicator来确认在TS包中的PES或者PSI是不是开始包,因为在封装的时候PES和PSI包 可能大于TS包,那就意味着,要把包截成俩截发送,但我们知道无论是PES包还是PSI包里面均有包头,所以你截取后 就要有字段标明这几部分,哪个是截取后的开始部分(以前的包头部分),哪部分是剩下部分。在编写代码的时候,我们需要 判断当前的这个包是不是开始部分。还要提到的一点就是,看了很多博客均提到

payload_unit_start_indicator(开始指示):为1时,"在前4个字节之后会有一个调整字节, 其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。

输入图片说明

一直不理解为什么,在看书后,明确了这个东西,来看段代码 。其实这里有诸多要注意的地方,即使我们跳过了上面包头后的自适应区,拿到有效数据,但这个有效数据也是要分情况讨论,如果是开始包的有效数据那就意味着你还要跳,而这里的这个字段有个名字叫pointer_field(程序特殊信息指针)。

 if (transport_packet_header.adaptation_field_control & 0x02)// 10 11              
	
	
	//10’仅含调整字段,无有效负载;‘11’调整字段后为 有效负载。                                                         
   
	{   
       size = *buff+1; //adaptation_field(buff);                                                                                                            
       buff += size;   // 跳过调整字段                                                                                                                          
       leng -= size;  // 剩下的包长度		
   }                                                                                                                                             
   
   if (transport_packet_header.adaptation_field_control & 0x01)  // 01    只有有效负载                                                                      
   {   
       if (buff[0]==0x00 && buff[1]==0x00 && buff[2]==0x01) //  pes包的包头是  0x 00 00 01                                                                     
       {   
           //log("dvbstrPESstream_ID");                                                                                                          
			pes_packet(buff,leng,&transport_packet_header);
       }                                                                                                                                         
       else                                                                                                                                      
		{   //PSI 数据。
			
		// 核心点:这里的pointer只在PES或者PSI的开始包中有,其大小为8位,其值为从这里到真正有效负载开始的距离,而是不是开始包的判断哪当然是依靠payload_unit_start_indicato字段。
			
			int pointer = *buff + 1;  
                   //  printf("zhangfeionline__%d\n",pointer);
           			
			if (transport_packet_header.payload_unit_start_indicator)    
             // 是开始包,那么里面就包含了一个字节的 pointer_field(程序特殊信息指针),需要解析出跳过			
			{   
				buff += pointer;                                                                                                                  
				leng -= pointer;                                                                                                                  
			}                                                                                                                                     
           // PSI

3.同时我们可以做一个记数校验。循环计数器 continuity_counter,用于对传输误码进行检测。在发送端对所有的包都做0-15的循环计数,在接收终端,如发现循环计数器的值有中断, 表明数据在传输中有丢失。 这里要说明的是这个字段在发送的时候就对一个个Ts进行了计数编码,值就保存在这个字段里面,所以在接收的时候我们就可以判断这个值是不是连续周期 的变化的。而在上面1中讲到的调整字段其实也是有一个表格详细阐述的,因为adaption_field_control(调整字段控制器)只能表明有没有调整字段而具体调整字段的长度,其实是在4个字节后的adaptation_field()里面的length。、

转载于:https://my.oschina.net/u/3506656/blog/909714

分享到:
评论

相关推荐

    linux c解析TS流

    在上述基础上,你可以构建一个简单的TS流解析器,用于在Linux环境下提取频道名称、音视频PID等信息。这个过程涉及到了网络编程、文件操作、位操作、数据结构和错误处理等多个方面的知识,是学习和理解多媒体传输协议...

    ts解析工具

    TS流解析是理解和处理这种数据流的关键步骤,通常用于解码、分析或转换TS文件。 TS流解析工具是用来检查、分析和解码TS流的软件。它们可以帮助我们理解TS包结构,查找错误,或者提取特定信息,如视频、音频和字幕...

    ts流解析器

    TS流解析器是一种用于处理传输流(Transport Stream, TS)数据的工具,主要应用于数字电视、卫星通信和网络视频传输等领域。TS流是一种分包传输的数据格式,它将音视频等多媒体信息分割成一个个固定大小的包进行传输...

    ts流文件解析工具 easyice v2.6 内含ts示例文件demo.ts

    在处理TS流时,解析工具至关重要,而EasyICE V2.6就是这样一款专业的TS流解析工具。 EasyICE V2.6是一款专为Windows XP、Windows 7和Windows 8设计的TS流分析软件,能够帮助用户深入理解TS流的结构和内容。通过这个...

    TS流解析出单路视频ES

    标题中的“TS流解析出单路视频ES”指的是在数字电视传输系统中,对Transport Stream (TS) 流进行解析,以提取出其中的Video Elementary Stream (ES)。TS流是一种用于传输多路音视频数据的协议,常用于数字电视广播、...

    解析TS流,播放音视频

    "解析TS流,播放音视频"这个主题涉及到多个关键技术点,包括TS流解析、网络传输(UDP组播)、音视频解码以及播放显示。我们将逐一探讨这些知识点。 首先,TS(Transport Stream)流是一种广泛用于数字电视和卫星...

    TS流解析源码,本地文件可直接转化

    综上所述,TS流解析是数字视频处理中的关键技术,它涉及到网络传输、数据包结构分析、视频编码等多个领域的知识。对于TS流解析源码的研究和实践,不仅可以提升对数字电视广播技术的理解,也为开发个性化的多媒体应用...

    TS流格式解析

    TS流格式解析 TS流格式解析是数字电视业务信息及其编码的核心内容,了解TS流格式解析可以帮助我们更好地理解数字电视业务信息的编码和解码过程。 TS流格式解析的基本概念: 1. ES(Elementary Stream):直接从...

    TS流解析(代码)

    1)在终端显示流中所有节目的信息(节目号,解码名字,音视频ID,输入一个节目号能够保存音视频数据包,能够在播放器中播放)。(PAT,SDT,PMT表的解析) 2)输入一个节目号能够显示未来几天的信息(EIT表的解析) 3...

    DVB编程实现TS流解析

    标题中的“DVB编程实现TS流解析”是指在数字视频广播(Digital Video Broadcasting, DVB)技术背景下,通过编程方式处理传输流(Transport Stream, TS)的过程。DVB是一种国际标准,用于数字电视、卫星电视、有线...

    TS 码流解析C实现

    TS码流解析是数字视频传输中的重要环节,它涉及到电视广播、互联网流媒体等领域。TS(Transport Stream,传输流)是一种被广泛使用的比特流格式,主要用于传输MPEG数据,包括音频、视频和其他辅助数据。本篇文章将...

    TS流解析及实例

    TS即是"Transport Stream"的缩写。...在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不一定都是有效数据,有一些可能为填充数据)。

    TS Parser(TS流解析工具)

    自己写的基于QT的码流解析工具。 特色: 1、支持导出XML 和 Text 文件。 2、支持Tag搜索。 3、支持大文件(2G+)码流解析。 4、支持PSI/SI表在码流中的出现时间。 欢迎反馈bug和意见。

    MPEG2TS流解析程序,输入为TS流文件,可以将视频和音频解析出来.zip

    MPEG2TS流解析程序是针对传输流(Transport Stream,简称TS)文件进行处理的工具,主要用于解码和提取TS文件中的视频和音频数据。在数字电视广播、视频编码和网络传输等领域,TS流格式被广泛应用。这个程序是用C#...

    解析TS流PAT和PMT代码.doc

    TS流的解析可以通过 parse_TS 函数实现,该函数将TS流解析成PAT和PMT表格,并将频道信息和节目信息存储在PROGRAM和PRO_LIST结构体中。 四、实现细节 在实现TS流解析时,我们需要使用C语言编写解析函数,例如 parse...

    TS流PAT、PMT表解析及根据相应的节目PID抽取PES、ES流

    PAT(Program Association Table)和PMT(Program Map Table)是TS流中的关键组成部分,用于解析节目信息和指导解码器正确地处理数据。 PAT表全称为节目关联表,它提供了所有节目(Program)与它们对应的节目网络...

    TS流解析之PAT表格解析.pdf

    TS流解析之PAT表格解析 TS流解析之PAT表格解析是数字电视放送中的一种技术,主要用于解析MPEG-2 Transport Stream(TS)中的PAT(Program Association Table,节目关联表)表格。PAT表格是TS流中最重要的部分之一,...

    ts流协议以及解析学习工具

    1包含了ts流解析封装的官方文档以及中文翻译,以及公司的ts流培训文档。 以及方便学些ts流解析工具。2. TS流基本概念和数据结构.pdf 3 ts协议培训.pdf 4 iso-13818-1.pdf 5 ts协议详解.pdf

    从ts文件或流中解析I帧

    首先,TS流解析是从PAT(Program Association Table)表的解析开始。PAT是TS流中的一个系统层元数据,它定义了节目与服务的关系,即告诉接收端哪些PID(Packet Identifier)对应着不同的节目。PAT本身包含了多个节目...

    ts流的分析及如何在gstreamer下播放ts流

    TS 流的分析及在 GStreamer 下播放 TS 流 TS 流是一种常见的数字视频流格式,广泛应用于数字电视、DVD 和 DVB 等领域。为了正确地播放 TS 流,需要对其进行分析,并了解其组成结构和相关技术。 一、MPEG-2 系统...

Global site tag (gtag.js) - Google Analytics