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流的主要内容,如果未能解决你的问题,请参考以下文章