精华内容
下载资源
问答
  • 什么是TS流 TS流(TransportStream)即在MPEG-2系统中,由视频,音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流。... TS是MPEG2中提出的一种流媒体的封装格式,适合流媒体播放。在M

    什么是TS流

    TS流(TransportStream)即在MPEG-2系统中,由视频,音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流。根据传输媒体的质量不同,MPEG-2中定义了两种复合信息流:传送流(TS)和节目流(PS:ProgramStream)。

     

    也可以从另外一个层面来理解TS流。 TS是MPEG2中提出的一种流媒体的封装格式,适合流媒体播放。在MPEG2中支持了2种媒体播放格式:本地播放的PS流(program Stream),网络播放的流媒体格式TS流(transport Stream)。


    流媒体传输协议和TS流

    在网上传输音频、视频等多媒体信息目前主要有两种方式:下载和流式传输。采用下载方式,用户需要先下载整个媒体文件,然后才能进行播放。由于网络带宽的限制,下载常常要花很长时间,所以这种处理方式延迟很大。

     

    而流媒体实现的关键技术是流式传输。传输之前首先对多媒体进行预处理(降低质量和高效压缩) ,然后使用缓存系统来保证数据连续正确地进行传输。使用流式传输方式,用户不必像采用下载方式那样要等到整个文件全部下载完毕,而是只需经过几秒到几十秒的启动延时即可在客户端进行播放和观看。此时媒体文件的剩余部分将在后台继续下载。

     

    与单纯的下载方式相比,这种对多媒体文件边下载边播放的流式传输方式不仅使启动延时大幅度地缩短,而且对系统缓存容量的需求也大大降低。使用流式传输的另一个好处是使传输那些事先不知道或无法知道大小的媒体数据(如网上直播、视频会议等) 成为可能。


    TS流的应用

    TS流应用比较广泛,如视音频资料的保存、电视节目的非线性编辑系统及其网络等。一般TS流的网络应用是将其封装在各种协议中进行网络传输。如RTSP, HTTP, UDP等。而我们常见的RTMP是封装的FLV视频在互联网中进行传输。

    如何将TS流通过P2P协议进行传输 

    1.       将TS流拉流过来并主动推送至支持P2P协议的800Li流媒体系统

    2.       通过800Li流媒体系统的P2P协议网络分发。

    3.       应用于网络电视OTT/IPTV方案的安卓机顶盒和安卓手机播放观看。


          TS源流拉流软件


    800Li Media Server P2P协议网络分发

    网络电视-安卓机顶盒APK界面

    PS: 有版权的七家牌照商

     

    1. 央视国际——CNTV(中央电视台为申请主体)
    2. 杭州华数(浙江、杭州电视台联合申请)
    3. 上海文广——百视通(上海电视台为申请主体)
    4. 南方传媒(广东电视台为申请主体)
    5. 湖南电视台
    6. 中国国际广播电台
    7. 中央人民电台

     

    展开全文
  • 一、环保数采仪是什么计讯TS910环保数采仪是结合各地在线监控工作的需求,特地推出的一款遵循国家环保行业标准设计的专用数据采集网关。集数据采集、处理传输于一体,广泛适用于污染源监测、地表水监测、空气质量...

    一、环保数采仪是什么

    计讯TS910环保数采仪是结合各地在线监控工作的需求,特地推出的一款遵循国家环保行业标准设计的专用数据采集网关。

    集数据采集、处理传输于一体,广泛适用于污染源监测、地表水监测、空气质量监测、区域环境噪声监测、大气环境污染源、地表水体污染源、地下水体污染源、海洋环境污染源、土壤环境监测、放射性环境污染源等监测领域。

    bfff5aa28ab1c15113c7b57c761a8c1b.png

    TS910 环保数采仪

     二、环保数采仪功能

    1、多种通信方式,传输更便捷

    集GPRS、4G网络、广域网、局域网、WIFI等多种通信方式,可选NB-IOT通方式,支持有线和无线互为备份,支持多中心通信,可同时与多个后台服务器进行通信。

    2、采集端口丰富,可实现路由器功能

    丰富的采集控制端口满足各种传感器的采集和控制,支持工业路由器功能,实现2路局域网接入和环保视频数据的采集和上传。

    3、工业级元器件选型,选配高清触摸屏

    采用高端处理器和工业级元器件选型,保障设备的稳定性和可靠性;选配7英寸高清触摸屏,实时了解数据,方便参数设置。

    4、支持多种通信协议,应用高效便捷

    支持(HJ/T212)通信协议,支持定制第三方的上位机通信协议;内置国内外主流仪器厂商通讯协议,方便用户快速调试使用,也可定制新增仪表协议。

    5、采用Arm架构高端处理器

    采用Arm架构高端处理器;标准Linux系统支持用户二次开发,使用更安全应用更灵活。

    ab688a7250b8e9e96aed1b4c507a77ee.png

    TS501 环保微型数采仪

     三、环保数采仪类型

    1、工业级环保数采仪

    TS910系列环保数采仪,采用高性能的工业级高端处理器,软件多级检测和硬件多重保护机制来提高设备稳定性,符合《HJ/T212-2005 污染源在线自动监控(监测)系统数据传输标准》;符合《HJ 212-2017 污染物在线监控(监测)系统数据传输标准》。

    2、环保微型数采仪

    TS501系列采集终端是集数据采集与2G 3G 4G数据传输功能于一体的环保微型采集仪,采用集简设计方式,满足关键的环保数据采集需求,完全符合《污染物在线自动监控(监测)系统数据传输标准》。

    展开全文
  •   es->pes->ts流程作用将采集到的裸数据一步一步通过在头部加包头的方式封装起来,使最后接收方接收到有该数据的相关描述信息,并由其中的信息进行数据的忽略,调整以及数据传输机制的调整。之后数据包头中的...

      在了解了流媒体的大概内容之后,下面将具体描述数据由数据源方发送给服务器方的封装过程。
      es->pes->ts流程作用是将采集到的裸数据一步一步通过在头部加包头的方式封装起来,使最后接收方接收到有该数据的相关描述信息,并由其中的信息进行数据的忽略,调整以及数据传输机制的调整。之后数据包头中的数据会有所反映(也希望后续能对为什么加这些数据能有更具体的了解)

    首先引用下http://blog.chinaunix.net/uid-9688646-id-1998407.html这篇博客的TS解码过程,以便后续的理解中可以方便参考和理解:

    TS 流解码过程:
    1. 获取TS中的PAT
    2. 获取TS中的PMT
    3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息。
    4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等。
    5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是 one piece of PES,在TS header中有一些关于此 payload属于哪个 PES的 第多少个数据包。
    因此软件中应该将此payload中的数据copy到PES的buffer中,用于拼接一个PES包。
    6. 拼接好的PES包的包头会有 PTS,DTS信息,去掉PES的header就是 ES。
    7. 直接将 被被拔掉 PES包头的ES包送给decoder就可以进行解码。解码出来的数据就是一帧一帧的视频数据,这些数据至少应当与PES中的PTS关联一下,以便进行视音频同步。
    8. I,B,B,P 信息是在ES中的。

    ES(Elementary Streams)–原始流

      ES(原始流)是指直接从编码器采集过来的数据流,包括视频流(H264,MJPEG…), 音频流(AAC), 以及其他的一些编码数据流。
      ES(原始流)顾名思义是最初的数据流,裸数据。后续的协议可以在原始流上添加各自的包头数据。
      因为是原始流,所以这里不详细介绍其用法,同时有一个VBV_delay(视频流延时值)存在于视频ES的头部,长度为16bit,在后面介绍PTS和DTS时会稍加解释。但还是有几点需要注意,入下所示。

    ES(原始流)单位专一性

      每个ES(原始流)只能包含一种数据类型,同时ES打包后的PES也同样只能包含一种数据类型,即如果ES中的一部分填充了H264数据,那么其他部分也只能填H264数据,就不能再填充音频数据及其他的一些数据。

    ES(原始流)的组成

      一个ES流中存在了许多个AU,AU即存储单位。
      每个AU由头部和编码数据组成,其中1个AU容量相当于一幅视频图像或1个音频帧。

    PES(Packetized Elementrary Stream)–被分组的原始流

      PES(被分组的原始流)是一种用来传递ES(原始流)的一种布局,而ES分组被称为PES分组。
    ES>PES描述
      ES至PES的流程如上图所示,而其中的第三步骤“参加包头信息”中参加的包头内容含有PTS和DTS,下面将针对这两个内容进行详细叙述。
      至此可以知道,一个PES中含有多个ES,而PES包为PES流的单位,PES包中包含:包头和payload。

    http://wenku.baidu.com/link?url=CU9-uT-m6MqN3HUyMu1CZvCpzTIPddDj_AJt7wH3EYm17FfGy8LZXDKeFYw70Tpp7JnBwAL7neRo4jCQkCfmThI8yPGOXBjiBTQrRUNMPr7
      上图中的包头又含有如下信息:

    (以后会对这其中的每一位信息进行详细的记录和说明)

    PTS(Presentation Time Stamp),DTS(Decoding Time Stamp)

      PTS(Presentation Time Stamp)–显示时间标记,表示的是显示单元出现在目标解码器的时间;
      DST(Decoding Time Stamp)–解码时间标记,表示存取单元从解码缓存器取出的时间;
      存在这两个值的目的是解决音视频同步,以及防止解码器上溢或者下溢的关键。在视频帧中I帧(关键帧)和P帧(预测帧)都存在PTS和DTS,而B帧(双向预测帧)只存在PTS,因为对于B帧PTS和DTS是相等的,所以没必要标出DTS。
      但这里为什么PTS和DTS能解决音视频的同步问题,因为I帧和P帧经过复用之后,数据之间的顺序会混乱,所以在显示前一定要存储于解码器的排序缓冲器中进行显示前的重新排序,重新插入PTS和DTS作为新顺序的依据。
      其实音视频同步的处理在es, pes和ts中都存在。在es层的AU(存取单元)中存在视频缓冲验证VBV(Video Buffer Verifier),作用是防止解码缓冲器的上溢或下溢;在pes层存在PTS(显示时间标签)和DTS(解码时间标签);在TS中存在节目时钟参考PCR,在同步中的作用是用来恢复与解码端一致的系统时序时钟STC。
      下面通过解码器实现音视频同步的步骤来进一步认识同步的原理:

    同步准备

    ES层
      从MPEG-2编码处获得ES基本数据流,该数据流包含视频的I,P,B帧,也可以包含音频帧或者是其他的一些数据流。pes打包器会在包头中包含PTS和DTS,并打包成一个长度可变的单位包。至此数据由流的形式转为以包分割的形式存在,如下图所示:
    (这里pes的单位pes包是指一帧一个单位包?)

    http://blog.chinaunix.net/uid-26000296-id-3478558.html

    PES层
      视频编码图像帧次序为 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9的ES,加入PTS/DTS后,打包成一个个视频PES包(其中一个PES包中的数据内容为一个视频帧或者一个音频帧)。每个PES包都有一个包头,用于定义PES内的数据内容,提供定时资料。对I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明PTS和DTS(B帧PTS与DTS相同)。

    例如,解码器输入的图像帧次序为I1,P4,B2,B3,P7,B5,B6,I10,B8,B9,依解码器输出的帧次序,应该P4比B2、B3在先,但显示时P4一定要比B2、B3在后,即P4要在提前插入数据流中的时间标志指引下,经过缓存器重新排序,以重建编码前视频帧次序I1,B2,B3,P4,B5,B6,P7,B8,B9,I10。显然,PTS/DTS标志表明对确定事件或确定信息解码的专用时标的存在,依靠专用时标解码器,可知道该确定事件或确定信息开始解码或显示的时刻。例如,PTS/DTS标志可用于确定编码、多路复用、解码、重建的时间。

      (当视频中无B帧时,DTS和PTS的输出顺序是一样的,也就是说在没有B frame的情况下.DTS和PTS的输出顺序是一样的.)
      而对于I帧,P帧,B帧的详细内容可以参考如下网站进行进一步的了解:http://blog.chinaunix.net/uid-26000296-id-3478558.html。这里贴出其中的一张图来大概地熟悉一下PTS与DTS对于I, P, B帧的解码和显示关系。
    该图显示:I frame 的解码不依赖于任何的其它的帧.而p frame的解码则依赖于其前面的I frame或者P frame.B frame的解码则依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

      有时候PES包头里面也会有DTS,PTS,对于PTS来说,他代表了这个PES包得payload里面的第一个完整地audio access unit或者video access unit的PTS时间(并不是每个音/视频接入单元都带有PTS/DTS,因此,你可以在PES里面指定一个,作为开始)。
      PES包头的DTS也是这个原理,只不过注意的是:对于video来说他的DTS和PTS是可以不一样的,因为B帧的存在使其顺序可以倒置。而对于audio来说,audio没有双向的预测,他的DTS和PTS可以看成是一个顺序的,因此可一直采用一个,即可只采用PTS。

    TS层
      TS层中对于时间同步含有PCR(Program Clock Reference),他是指示系统时钟本身的瞬时值的时间标签称为节目参考时钟标签。在TS packet的header里面可能会有,他用来指定所期望的该ts packet到达decoder的时间。

      而关于同步的相关具体内容觉得以下这篇文章给予了很详细的讲解:
      http://blog.chinaunix.net/uid-26000296-id-3478558.html

    TS(TransPort Stream)–传输流

      TS(TransPort Stream)传输流,是pes连同pes包头信息的再一次封装,固定188的字节长度。至此,es已经过两层封装。
      这里的固定长度使他能在网络环境恶劣的情况下仍然能进行数据的同步,也就是说,就算在进行数据流传输是丢失了个别的TS包,接收机也能在该坏包后的固定长度来定位读取到一个正常的数据包,进而恢复同步,避免信息丢失。
      TS有两个特性,分别是单一性和混合性。
      单一性:一个TS包固定188个字节大小。
      混合型:TS不同于es与pes,TS可以有多种数据类型组成。一个TS包中的数据可以是视频数据,音频数据,填充数据,PSI/SI表格数据等(唯一PID表对应)。
    TS中后续的PSI, PAT, PMT将在后续的各阶段数据包头封装时了解总结。

    ES->PES->TS总结

      首先引用一张图片来系统的了解es,pes,ts的封装过程:
      引用自:
    http://www.360doc.com/content/13/0829/15/13084517_310733557.shtml

    这里写图片描述

    步骤一:
      首先将A/D编码器中的数据通过MPEG-2*(后续需要进一步了解)*来压缩编码得到ES流,这个ES流的特点是数据流的量很大,是一些I帧,P帧,B帧,音频帧,或者一些其他数据流。

    步骤二:
      ES流通过PES打包器打包成由一个一个的以PES包(一个PES包一个视音频帧)为基本单位的PES流,每个PES包前有一个PES头,存放一些数据的描述信息。自此,数据由流的形式转变为以包分割的形式。

    步骤三:
      PES流经过再次封装,即再次的增加包头信息,以及一些节目表组成TS流。因每路只包含一路的音视频编码数据流,所以每路PES也只包含相应的数据流。

    展开全文
  • TS解析

    千次阅读 2012-12-26 16:25:46
    码流部分其实就是DVB协议的最底层,类似于TCP/IP协议的数据链路层,这一层关心的是数据打包,数据帧结构和传输,而不关心负载是什么。 码流中最基本的单位是188字节的包(Packet,又称为分组),前4BYTE是包头,后184...
    传输流Transport Stream(通常称为一路码流),是最基本的传输实现,数据最终以码流的方式输出。码流部分其实就是DVB协议的最底层,类似于TCP/IP协议的数据链路层,这一层关心的是数据打包,数据帧结构和传输,而不关心负载是什么。

    码流中最基本的单位是188字节的包(Packet,又称为分组),前4BYTE是包头,后184为负载



    码流的速率称为码率,单位是bit/s,因此可以计算出一个100M的码流文件在码流发生器上以38M码率发送时,持续时间是:
    100M(BYTE) × 8 / 38M = 21.05秒
    码流中包的传输
    从下往上看看这个图:
    视频基本流(即压缩好了的视频信号)先是被封装,成为视频打包基本流(VPES);
    因为TS流的基本传输单元是TS包,因此VPES再次被打包成TS包(图中的TP分组);
    然后它和其它的众多TS包一起,混合(复用)到TS流中送出



    在TS包的结构中,前面4个BYTE定义为包头。
    其中有一个叫PID(Packet_ID)的字段。
    协议规定,对于要进行传输的一个组件,或者一个Section,当被封装为TS包时,其PID相同。
    例如:某电影频道的视频数据,装载它的各个包,其PID都为0152;其音频数据则都在PID为0196的包中传输。


    有少数一些PID被规定用于传输某些特定数据;而另一些(用户定义)则可灵活使用


    Ts包结构


    语法描述:
    syn_byte: 这是一个1B长的字段,其值为0x47,该字段是MPEG-2TS的传送包标识符。
    transport_error_indicator: 这是一个1b长度的字段。值为1时,表示在相关的传送包中至少有一个不可纠正的错误,只有在错误纠正之后,该胃才能被重新置0。
    payload_unit_start_indicator: 这时1b长度的字段。该字段用来表示TS包的有效净荷有PES包或者PSI数据的情况。
    当TS包带有PES包数据时,payload_unit_start_indicator具有以下的特点:置为1,标识TS包的有效净荷以PES包的第一个字节开始;置为0,表示TS包的开始不是PES包。
    当 TS包带有PSI数据时,payload_unit_start_indicator具有以下特点:置为1,表示TS包带有PSI部分的第一个字节,即第一个字节带有指针pointer_field;置为0,表示TS包不带有一个PSI部分的第一个字节,即在有效净荷中没有指针point_field。
    对于空包的包,payload_unit_start_indicator应该置为0。
    transport_priority: 这是一个1b长度的字段。当该字段置为1,表示相关的包比其他具有相同PID但此字段为“0” 的包有更高的优先权。可以根据此字段确定在一个原始流中数据的传送优先级。
    PID: 这个13b长度的字段,表示存储于传送包的有效净荷中数据的类型。PID=ox0000表示净荷的数据为节目关联表;PID=0x0001表示净荷的数据为条件访问表;PID=0x0003~0x000F为保留;PID=0x1FFF表示净荷的数据空包;其他PID值表示净荷的数据为节目映射表,网络信息,以及由用户定义打包的音频/视频数据PES包等。
    transport_scrambling_control: 这是一个2b长度字段。该字段用来指示传送流包有效净荷的加扰方式。如果传送流包首部包含调整字段,则不应该被加扰。对于空包,transport_scrambling_control的值为“00”。
    adaptation_field_control: 这是一个2b长度字段,表示传送流包首部是否跟随有调整字段和/或有效净荷。
    continuity_counter: 这是一个4b长度的字段。随着具有相同的PID TS包的增加而增加,当它达到最大时,有恢复为“0”。如果调整字段控制值adaptation_field_control为“00”或“10“,该连续计数器不增加。
    data_byte: 该字段为1B长度的数据,在此之前,应根据该TS包头的结构定义及其相关含义与TS包的188B大小计算循环字节长度N,数据字节可以是PES包、PSI部分以及私有数据的连续字节。


    在MPEG-2协议中,采用了一种索引的思路来进行节目的寻找
    1、  找到PAT表
    2、  PAT表之所以叫做节目关联表,就是因为它指出了   当前这个TS流中包含的各个节目其各自所对应的   PMT表的PID
    3、  既然我们能知道某个节目它的PMT表所在的TS包   的PID了,那我们就能通过检索PID的方式,把这个      PMT表找出来
    4、  PMT表叫做节目映像表,它指出了它所描述的节目 其所对应的视频流、音频流、PCR(时间参考信息)      的PID
    5、  既然有了流所在TS包的PID,      那就在当前TS流中过滤出PID等于这个PID值的包,    这些过滤出来的包依序排列,就可以从中还原出流了。
    6、  有了视频基本流、音频基本流、参考时      钟,机顶盒就能够对节目进行解码,输出显示在电视     画面上了。
     
    下面以一个实际例子说明:


    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、transport_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 10 00第五个字节是00,说明紧跟着00之后就是具体的负载内容。
    下面给出PAT表的结构体:

    PAT语法字段介绍: 
    table_id : 这是一个1B的字段,该字段标识了一个TS PSI分段的内容是节目关联分段,条件访问分段还是TS节目映射分段等。对于PAT,置为0x0。 
    section_syntax_indicator : 这是一个1bit的字段,对于PAT,置为0x1. 
    section_length : 这是一个12bit的字段,该字段指示分段的字节数,由分段长的字段开始,包含CRC,其值不超过1021。 
    transport_stream_id : 这是一个2个B的字段,作为一个标签,该字段指出在网络中与其他复用流的区别标志,其值由用户定义。 
    version_number : 这是一个5b字段,该字段指出所有的PAT的版本号。一旦PAT有变化,版本号加1,当增加到31时,版本号循环回到0。 
    current_next_indicator : 这个1b指示位,置为1时,表示传送的PAT当前可以使用;置为0时,表示该传送的表不能使用,下一个表变为有效。 
    section_number : 这是1B字段,给出拉该分段的数目。在PAT中的第一个分段的section_number位0x00,PAT中每一个分段将加1。 
    last_session_number : 这时一个1B字段,该字段指出了最后一个分段号。在整个PAT中即分段号的最大数目。 
    program_number : 这是一个2B字段,该字段指出了节目对于哪一个program_map_PID是可以使用的。如果是0x0000,那么后面的PID是网络PID,则其他值由用户定义。 
    network_PID : 这是一个13b字段,该字段指出含有NIT的TS包的PID值。此值由用户定义。 
    program_map_PID : 这是一个13b字段,该字段知道TS包中的PID值。该TS应包含适用于program_number所指明的节目的program_map_section,该字段由节目号指定。一个节目号有一个progarm_map_PID的定义。该字段由用户定义。 
    CRC_32 : 这是一个32b字段,用来检验数据正确性的循环冗余校验码。

    typedef struct TS_PAT_Program
    {
     unsigned program_number    :16; 
      unsigned reserved_3       : 3; 
      union PID{
    	 unsigned program_map_PID   :13;   
    	 unsigned network_PID       : 13; 
    	 }u_pid;
    }TS_PAT_Program;
    
    //PAT表结构体
    typedef struct TS_PAT
    {
        unsigned table_id                        : 8; 
        unsigned section_syntax_indicator        : 1; 
        unsigned zero                            : 1; 
        unsigned reserved_1                        : 2; 
        unsigned section_length                    : 12; 
        unsigned transport_stream_id            : 16; 
        unsigned reserved_2                        : 2;
        unsigned version_number                    : 5; 
        unsigned current_next_indicator            : 1; 
        unsigned section_number                    : 8; 
        unsigned last_section_number            : 8;  
     
     	std::vector<TS_PAT_Program> program;
        unsigned CRC_32                            : 32;  
    } TS_PAT
    typedef struct TS_PAT_Program
    {
     unsigned program_number    :16; //节目号 
      unsigned reserved_3       : 3; 
      union PID{
    	 unsigned program_map_PID   :13;   //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个 unsigned network_PID 
    	 unsigned network_PID       : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID
    	 }u_pid;
    }TS_PAT_Program;
    
    //PAT表结构体
    typedef struct TS_PAT
    {
        unsigned table_id                        : 8; 
        unsigned section_syntax_indicator        : 1; 
        unsigned zero                            : 1; 
        unsigned reserved_1                        : 2; 
        unsigned section_length                    : 12; 
        unsigned transport_stream_id            : 16; 
        unsigned reserved_2                        : 2;
        unsigned version_number                    : 5; 
        unsigned current_next_indicator            : 1; 
        unsigned section_number                    : 8; 
        unsigned last_section_number            : 8;  
     
     	std::vector<TS_PAT_Program> program;
        unsigned CRC_32                            : 32;  
    } TS_PAT;
    
    RESULT CTS_Stream_Parse::adjust_PAT_table( TS_PAT * packet, unsigned char * buffer)
    {
        packet->table_id                    = buffer[0];
        packet->section_syntax_indicator    = buffer[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[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            = buffer[7];
    
        int len = 0;
        len = 3 + packet->section_length;
        packet->CRC_32                        = (buffer[len-4] & 0x000000FF) << 24
      | (buffer[len-3] & 0x000000FF) << 16
      | (buffer[len-2] & 0x000000FF) << 8 
      | (buffer[len-1] & 0x000000FF); 
     
      
    	 int n = 0;
        for ( n = 0; n < packet->section_length - 12; n += 4 )
        {
        	TS_PAT_Program PAT_program;
    			PAT_program.program_number = buffer[8 + n ] << 8 | buffer[9 + n ];  
    			
    			PAT_program.reserved_3    = buffer[10 + n ] >> 5;  
    			packet->pid.network_PID = 0x00;
    			if ( program_num == 0x00)
    			{  
    					PAT_program.u_pid.network_PID = (buffer[10 + n ] & 0x1F) << 8 | buffer[11 + n ];
    					
    			}
    			else
    			{				
    					PAT_program.u_pid.program_map_PID = (buffer[10 + n] & 0x1F) << 8 | buffer[11 + n];
    		
    			}  
    			packet->program.push_back( PAT_program );       
        }
     return 0;
    }

    通过分析,我们也可以分析出PAT表各字段的值,如program_map_PID为0xfff,我们也可以用ts_reader.exe工具分析:

    由此我们知道PMT表的pid为0xfff,所以查找47 4f ff的开头的TS包


    下面来分析PMT表,先给出PMT(Program Map Table)的结构体:


    PMT语法字段介绍: 
    table_id : 这是一个1B的字段,对于PMT置为0x02。 
    section_syntax_indicatior : 这是一个1b的字段,对于PMT,值为1。 
    section_lenth: 这是一个12b的字段,前两位置为00,表示字段的字节数,包括section_length字段和CRC字段。 
    program_number: 该字段指出该节目对应于可应用的program_map_PID。一个节目定义仅含一个TS的program_map_section,因此一个节目定义长度不超过1026B。 
    version_number : 这是一个5b的字段,该字段指出了program_map_section的版本号。当字段中有关信息发生变化时,版本号将以32为模加1。版本号时关于一个节目的定义,因此版本号是关于单一段的定义。 
    curren_next_indicator : 这是一个1b的字段,当字段置为0时,表示当前传送的program_map_section可以;当置为0时,表示当前传送的program_map_section不可用,下一个TS的program_map_section有效。
    section_number : 这是一个1B长度的字段,该字段值总是0x00。 
    last_section_number:这是一个1B长度的字段,该字段值总是0x00。 
    PCR_PID: 这是一个13b长度的字段,该字段指示TS包的PID值。该TS包含有PCR字段,而该PCR值对应于由节目号指定的节目。如果对于私有数据流的急忙定义与PCR无关,该字段的值将位0x1FFF。 
    program_info_length: 这是一个12b长的字段,前2位是00。该字段指出跟随其后对节目信息描述的字节数。 
    stream_type: 这是一个1B长度的字段,该字段指定特定PID的节目元素包的类型。即他定义了在TS包中PES流的类型,如下表。该处的PID由element_PID指定。
    element_PID: 这是一个13b长度的字段。该字段指示TS包的PID值。这些TS包含有相关的节目元素。 
    ES_info_length: 这是一个12b长度的字段,前2位为00。该字段指示跟随其后的描述相关节目元素的字节数。 
    CRC_32:这是一个32b字段,用来检验数据正确性的循环冗余校验码。 


    PMT结构定义:
    
    typedef struct TS_PMT_Stream
    {
     unsigned stream_type            : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定
     unsigned elementary_PID         : 13; //该域指示TS包的PID值。这些TS包含有相关的节目元素
     unsigned ES_info_length         : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数
     unsigned descriptor;
    }TS_PMT_Stream; //--------
     
    //PMT 表结构体
    typedef struct TS_PMT
    {
        unsigned table_id                        : 8; //固定为0x02, 表示PMT表
    --------byte: 1-------------
        unsigned section_syntax_indicator        : 1; //固定为0x01
        unsigned zero                            : 1; //0x01
        unsigned reserved_1                      : 2; //0x03
        unsigned section_length  : 12;//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC。
    --------byte: 4-------------
        unsigned program_number                    : 16;// 指出该节目对应于可应用的Program map PID
    --------byte: 6-------------
        unsigned reserved_2                        : 2; //0x03
        unsigned version_number                    : 5; //指出TS流中Program map section的版本号
        unsigned current_next_indicator        : 1; //当该位置1时,当前传送的Program map section可用;
    --------byte: 7-------------
       //当该位置0时,指示当前传送的Program map section不可用,下一个TS流的Program map section有效。
        unsigned section_number                    : 8; //固定为0x00
        unsigned last_section_number            : 8; //固定为0x00
    --------byte: 9-------------
        unsigned reserved_3                        : 3; //0x07
        unsigned PCR_PID                        : 13; //指明TS包的PID值,该TS包含有PCR域,
                //该PCR值对应于由节目号指定的对应节目。
                //如果对于私有数据流的节目定义与PCR无关,这个域的值将为0x1FFF。
    --------byte: 11-------------
        unsigned reserved_4                        : 4; //预留为0x0F
        unsigned program_info_length            : 12; //前两位bit为00。该域指出跟随其后对节目信息的描述的byte数。
        --------byte: 13-------------
     std::vector<TS_PMT_Stream> PMT_Stream;  //每个元素包含8位, 指示特定PID的节目元素包的类型。该处PID由elementary PID指定
        unsigned reserved_5                        : 3; //0x07
        unsigned reserved_6                        : 4; //0x0F
    ------single: 5 Bytes---------
        unsigned CRC_32                            : 32;
    } TS_PMT;
     
    解析代码为:
    HRESULT CTS_Stream_Parse::adjust_PMT_table ( TS_PMT * packet, unsigned char * buffer )
    {
        packet->table_id                            = buffer[0];
        packet->section_syntax_indicator            = buffer[1] >> 7;
        packet->zero                                = buffer[1] >> 6 & 0x01;
        packet->reserved_1                            = buffer[1] >> 4 & 0x03;
        packet->section_length                        = (buffer[1] & 0x0F) << 8 | buffer[2];   
        packet->program_number                        = buffer[3] << 8 | buffer[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                    = buffer[7];
        packet->reserved_3                            = buffer[8] >> 5;
        packet->PCR_PID                                = ((buffer[8] << 8) | buffer[9]) & 0x1FFF;
     PCRID = packet->PCR_PID;
        packet->reserved_4                            = buffer[10] >> 4;
        packet->program_info_length                    = (buffer[10] & 0x0F) << 8 | buffer[11];
        // Get CRC_32
     int len = 0;
        len = packet->section_length + 3;   
        packet->CRC_32                = (buffer[len-4] & 0x000000FF) << 24
      | (buffer[len-3] & 0x000000FF) << 16
      | (buffer[len-2] & 0x000000FF) << 8
      | (buffer[len-1] & 0x000000FF);
     int pos = 12;
        // 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; )
        {
      TS_PMT_Stream pmt_stream;
      pmt_stream.stream_type =  buffer[pos];
      packet->reserved_5  =   buffer[pos+1] >> 5;
      pmt_stream.elementary_PID =  ((buffer[pos+1] << 8) | buffer[pos+2]) & 0x1FFF;
      packet->reserved_6     =   buffer[pos+3] >> 4;
      pmt_stream.ES_info_length =   (buffer[pos+3] & 0x0F) << 8 | buffer[pos+4];
      
      pmt_stream.descriptor = 0x00;
      if (pmt_stream.ES_info_length != 0)
      {
       pmt_stream.descriptor = buffer[pos + 5];
       
       for( int len = 2; len <= pmt_stream.ES_info_length; len ++ )
       {
        pmt_stream.descriptor = pmt_stream.descriptor<< 8 | buffer[pos + 4 + len];
       }
       pos += pmt_stream.ES_info_length;
      }
      pos += 5;
      packet->PMT_Stream.push_back( pmt_stream );
      TS_Stream_type.push_back( pmt_stream );
        }
     return 0;
    }


    PMT结构体里的stream_type、elementary_PID这两个元素,前一个用来确定后一个作为标识PID的内容具体是什么,音频或视频等
    stream_type 值定义在iso13818-1中
    从这里, 我们就可以得到各路流的PiD,接着就可以收取相关pid流的数据,


    TS 流解码过程:
    1. 获取TS中的PAT
    2. 获取TS中的PMT
    3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息。
    4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等。
    5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是 one piece of PES,在TS header中有一些关于此 payload属于哪个 PES的 第多少个数据包。 因此软件中应该将此payload中的数据copy到PES的buffer中,用于拼接一个PES包。
    6. 拼接好的PES包的包头会有 PTS,DTS信息,去掉PES的header就是 ES。
    7. 直接将 被被拔掉 PES包头的ES包送给decoder就可以进行解码。解码出来的数据就是一帧一帧的视频数据,这些数据至少应当与PES中的PTS关联一下,以便进行视音频同步。
    8. I,B,B,P 信息是在ES中的。





    展开全文
  • 我们最常见的流媒体协议的RTMP协议,在网络和硬件正常好的情况下,延迟可以达到1-3s左右,它也目前...理论上利用 websocket + AVC TS 可以实现的,但是正常总会遇到很多现实的问题。 在h5页面中,如果要用RTM...
  • 流媒体技术学习笔记之(十)HLS协议直播延时优化(35s到10S)1、首先要了解HLS延时的机制,也就是为什么会延时,延时主要发生在什么地方。HTTP Live Streaming 并不一个真正实时的流媒体系统,这因为对应于媒体分段...
  • Apple的动态码率自适应技术。... 常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这二种基本完全不同的东西,目前比较方便又好用的用 HTTP 渐进下载方法。在这个中 apple 公司的
  • HLS协议详解

    2021-04-07 13:15:02
    什么苹果要提出HLS这个协议,其实主要为了解决RTMP协议存在的一些问题.比如RTMP协议不使用标准的HTTP接口传输数据,所以在一些特殊的网络环境下,可能被防火墙屏蔽掉.但是HLS由于使用的HTTP协议传输数据,不会遇到被...
  • 2、PS和TS是什么包? ES是MPEG的基本数据,包含视频ES和音频ES,为了保持视音频在传输中同步,分别把视频和音频的ES切成N段打包成PES,然后把PES封装成PS或者TS包,TS流主要用于传输,所以TS采用定长的188或204字节打包,...
  • I2C协议时序以及协议变体

    千次阅读 2018-05-29 22:50:51
     什么叫从设备呢,从设备指被主控设备选中从而按照具体协议通信的设备就是从设备,那么I2C从设备就是主控和被控走的I2C协议,常见的I2C从设备有:HDMI,cmos camera(手机平板前后摄像头),电容触摸屏TS,重力...
  • 最近在学习TS流文件的解析,有点...section所有table的共有形式,包括PAT,PMT,NIT,CAT和所有SI table,一个section最大4096字节,section作为应用协议层存在。在传输时,它被打包成TS packet格式。 TS packet...
  • 什么是HLS协议: HLS(HttpLiveStreaming)由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一M3U8描述文件,二是TS媒...
  • 什么是HLS? 视频直播需要什么?

    千次阅读 2016-07-07 08:47:41
    HLS(Http Live Streaming )由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列...
  • 实际上访问的是 所在的IP地址, 域名是什么?,一个代称。方便我们用户对网站进行访问 我们在发送请求的过程中。所遵循的规则(也就是协议)。就是 http协议 为什么要遵守规则(协议)? 举例,就好比打电话。 你说中文。...
  • 由于之前有用户有在EasyNVR视频平台当中增加音频的需求,所以TSINGSEE青犀视频讲过了EasyNVR增加音频的实现方式,大家可以看《EasyNVR如何在直播或录像中添加定制化...由于写入音视频的判读条件 av_compare_ts。av_c
  • 原来这样的,客户直播网站基于 HLS (HTTP Live Streaming) 协议构建的,HLS苹果公司基于http流媒体传输协议,它的特点并不是一下请求完整的数据流,它在服务端讲媒体数据切割成持续的时长较短的ts小文件,...
  • 支持断点续传,可下载 HLS 视频的所有 .ts 文件,最后将所有片段合并为一个 .ts 文件。拖拽需要下载的文件到状态栏图标,即刻开始下载,您也可以安装浏览器插件来捕获下载链接。 加快下载速度,达到可用的BandWidth...
  • Ts 5】Httpclient的应用和封装

    热门讨论 2016-11-08 19:59:50
    1.1,什么是Httpclient HttpClient Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 这只是简单介绍,...
  • 什么是前后端分离? 真的需要前后端分离吗? 前后端分离将遇到的那些挑战 前后端分离的核心:后台提供数据,前端负责显示 输出逻辑:数据显示 不可避免的前端逻辑:表单 SEO 优化技巧 搜索引擎优化都...
  • 保利威视教程:什么是HLS?

    千次阅读 2015-08-26 11:11:36
    HLS(Http Live Streaming )由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列...
  • http. 协议的坑

    2020-05-15 16:56:54
    这两天做了个demo功能从现网上抓取m3u8文件,然后再抓取相应的ts文件。 然而做好以后什么都挺好的,就是下载速度跟便秘一样,查了以后,发现网络没有问题,wget和vlc播放都正常。 查了以后发现http请求文件...
  • HLS协议是什么?HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。​是苹果公司QuickTime X和iPhone软件系统的一部分。 它的工作原理是把整个流分成一个个小的基于HTTP的文件...
  • 什么是终端服务网关服务器?

    千次阅读 2010-07-09 15:26:00
    “网关”连接两个使用不同网络协议的网络的任何计算机。网关对一个网络中的信息重新编排格式,使其与其他网络相兼容。 终端服务网关(TS 网关)服务器这样一种网关,它允许授权的用户从具有 Internet...
  • 1.什么是三方登录? 三方登录就是通过第三方应用...例如: QQ登录 ...2.三方登录存在的问题 ...那么我们就可以窃取用户的QQ号, 做一些见不得人的事 3.如何解决这个问题?...通过OAuth协议进行授权 4.什么是OAuth协议?(Open Authori

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

ts是什么协议