TS流

Posted gsp1004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

 

以上是关于TS流的主要内容,如果未能解决你的问题,请参考以下文章

数字广播TS流简介

TS流

ES流PES流PS流和TS流介绍

用 ts 包装 h264 流(传输流)

JavaCV音视频开发宝典:rtsp转推到rtp(非TS流方式),及使用TS流发送解决sdp缺失问题

JavaCV音视频开发宝典:rtsp转推到rtp(非TS流方式),及使用TS流发送解决sdp缺失问题