zoukankan      html  css  js  c++  java
  • TS流

    声明:大部分内容转自https://blog.csdn.net/dxpqxb/article/details/79654004

    一 从TS流开始

            数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS流是什么,以及TS流是怎样形成、有着怎样的结构。

    (一) TS流、PS流、PES流和ES流都是什么?

           ES流    (Elementary Stream):基本码流,不分段的音频、视频或其他信息的连续码流。

           PES:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。

           这个扯犊子的PS流可以先跳过,不然东西一多更看不懂。。。PS流 (Program Stream):节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。

           TS流   (Transport Stream):传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。

          *NOTE:TS流和PS流的区别:TS流的包结构是长度是固定的;PS流的包结构是可变长度的。这导致了TS流的抵抗传输误码的能力强于PS流(TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一 PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。)

           由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流的包格。

    (二) TS流是如何产生的?

           

            从上图可以看出,视频ES和音频ES通过打包器和共同或独立的系统时间基准形成一个个PES,通过TS复用器复用形成的传输流。注意这里的TS流是位流格式(分析Packet的时候会解释),也即是说TS流是可以按位读取的。

    (三) TS流的格式是怎样的?

            TS流是基于Packet的位流格式,每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。整个TS流组成形式如下:

     

    Packet Header(包头)信息说明

    1

    sync_byte

    8bits

    同步字节

    2

    transport_error_indicator

    1bit

    错误指示信息(1:该包至少有1bits传输错误)错误将丢弃此包

    3

    payload_unit_start_indicator

    1bit

    负载单元开始标志(packet不满188字节时需填充)

    4

    transport_priority

    1bit

    传输优先级标志(1:优先级高)

    5

    PID

    13bits

    Packet ID号码,唯一的号码对应不同的包

    6

    transport_scrambling_control

    2bits

    加密标志(00:未加密;其他表示已加密)

    7

    adaptation_field_control

    2bits

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

    8

    continuity_counter

    4bits

    包递增计数器 范围0-15

            PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。

    PID 值

    PAT

    0x0000

    CAT

    0x0001

    TSDT

    0x0002

    EIT,ST

    0x0012

    RST,ST

    0x0013

    TDT,TOT,ST

    0x0014

            下面以一个TS流的其中一个Packet中的Packet Header为例进行说明:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    Packet(十六进制)

    4

    7

    0

    7

    e

    5

    1

    2

    Packet(二进制)

    0

    1

    0

    0

    0

    1

    1

    1

    0

    0

    0

    0

    0

    1

    1

    1

    1

    1

    1

    0

    0

    1

    0

    1

    0

    0

    0

    1

    0

    0

    1

    0

    Packet Header 信息

    1 sync_byte=0x47

    2

    3

    4

    5 PID=0x07e5

    6

    7

    8

    sync_byte=01000111,                        就是0x47,这是DVB TS规定的同步字节,固定是0x47.

    transport_error_indicator=0,             表示当前包没有发生传输错误.

    payload_unit_start_indicator=0,      含义参考ISO13818-1标准文档

    transport_priority=0,                        表示当前包是低优先级.

    PID=00111 11100101即0x07e5,       Video PID

    transport_scrambling_control=00,  表示节目没有加密

    adaptation_field_control=01           即0x01,具体含义请参考ISO13818-1

    continuity_counte=0010                即0x02,表示当前传送的相同类型的包是第3个

    adaptation_field_control的具体解释:

    这个东西包含2bits(假如用XY表示),所以XY总共有00,01,10,11   这4种组合

    X表示是否包含调整字段,0表示不包含,1表示包含

    Y表示是否包含有效负载,0表示不包含,1表示包含

    所以01表示只包含后面的184B只包含payload

           10表示只包含后面只包含调整字段

           11表示调整字段和payload都有

           00表示都没有,都没有我解码器就不用管你了,你这个包就是个five。。。

    下图的adaptation field就是调整字段,说白了就是如果payload不是184bytes(比如是最后一个包,我剩余的数据量就只有100bytes,那我的payload就只有100B了,但是你一个ts又非要有188B,那中间就要填充188-100-4 = 84B),就得填充

    但是这个adaptation field除了为补足188B之外还有没有别的什么用还不知道,说不定还可以传一些有用的信息?因为网上找的资料只是说00解码器就不管,但是10表示只包含后面只包含调整字段,如果他真的只是用于填充,解码器也可以不管他吧

    如果仅仅是填充,那么也应该有一个填充的格式吧(比如固定填充0XFF?)

    但是就是你有填充格式,我咋知道你到底是要填充多少个bytes???是不是说你的第一个byte里面保存的是你的长度,这个长度包含这个byte?毕竟1byte可以表示255,足够了???不清楚。。。

    emmm,下图至少能证明这个adaptation field(自适应字段)并不是没有用,所以解码器还是要看看它的。。。

    但是具体含义么,还没深究,但是果然的第一个byte里面保存的是adaptation field的长度,猜对啦,嘎嘎~~~

    自适应字段的所有含义不清楚,先挖个坑,以后再填吧~~~

    再存一个大佬的文章网址:

    https://blog.csdn.net/u013354805/article/details/51578457 

  • 相关阅读:
    react-project(二)
    JS--轻松设置获取表单数据
    C#基础---Queue(队列)的应用
    C#基础---Attribute(标签) 和 reflect(反射) 应用二
    C#基础---Attribute(标签) 和 reflect(反射) 应用
    基于Cordova的博客园三方App
    Vue站点的搭建之旅
    移动端浏览器问题汇总
    C#基础---浅谈XML读取以及简单的ORM实现
    WebSite---前台系统图片验证码心得
  • 原文地址:https://www.cnblogs.com/gsp1004/p/11326315.html
Copyright © 2011-2022 走看看