PSI/SI资料快查

资料入口

这里是PSI/SI相关资料的主入口, 你有任何需要查询的资料,都可以从这里开始寻找...



本资料集由 林晓州 收集和整理,并提供共享。
邮箱: 1139904786@qq.com
网址: http://www.onelib.biz




©2016 · OneLib智库 · 分享知识和经验,打造精品智库平台

TS流的制作、传输及解析

DVB和PSI/SI的基础知识

在这一章中,你讲了解到:ES、PES、PS和TS是什么,复用与解复用的概念,TS流的传输方式,TS流的包结构 等。 这些内容是学习DVB的PSI/SI信息的最基本知识。

TS流、PS流、PES流和ES流都是什么

Brief Introduction Of TS, PS, PES and ES

ES流(Elementary Stream) 基本码流,不分段的音频、视频或其他信息的连续码流。
PES流 把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。
PS流(Program Stream) 节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。
TS流(Transport Stream) 传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。


PES包装载到TS包

在实际传输中,PES包会被切割后装载到TS包中。下图是PES和TS之间的关系图:

    要注意的几点是:
  • (1)一个PES包可以装载到不同的TS包
  • (2)每一个TS包必须只含有从一个PES来的数据
  • (3)PES包头必须跟在TS包的链接头后面
  • (4)对于一个特定的PES,最后一个TS包可以含有填充比特

TS和PS的区别

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

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

TS的复用与解复用

Multiplexing and Demultiplexing of Transport Stream

在数字电视系统的前端,所有的数据(视频、音频、PSI/SI信息)都会被复用器(Multiplexer)复用成TS流,从而进行传送(见下图)。

TS复用(Multiplexing)

当机顶盒等接收器收到的数据,自然就是被复用后的一个个包(Package)了。这样的数据是不能直接使用的。 这时候,我们要做的就是把被复用的TS流 解复用(Demultiplexing, 简称Demux)

解复用的意义在于,由于TS流是一种复用的码流,里面混杂了多种类型的包;解复用TS流可以将类型相同的Packet存入相同缓存,分别处理。 这样就可以将Video、Audio或者其他业务信息(如PSI/SI信息)的数据区分开来。

DVB搜台过程

Process of DVB Scanning

DVB搜台过程

机顶盒先调整高频头到一个固定的频率(一般是主频点,如深圳天威的主频点是259MHZ),如果此频率有数字信号, 则COFDM芯片(如MT352)会自动把TS流数据传送给MPEG-2 decoder。 MPEG-2 decoder先进行数据的同步,也就是等待完整的Packet的到来.然后循环查找是否出现PID==0x0000的Packet; 如果出现了,则马上进入分析PAT的处理,获取了所有的PMT的PID。 接着循环查找是否出现PMT,如果发现了,则自动进入PMT分析,获取该频段所有的频道数据并保存。 如果没有发现PAT或者没有发现PMT,说明该频段没有信号,进入下一个频率扫描。

在解析TS流的时候,首先寻找PAT表,根据PAT获取所有PMT表的PID;再寻找PMT表,获取该频段所有节目数据并保存。 这样,只需要知道节目的PID就可以根据PacketHeade给出的PID过滤出不同的Packet,从而观看不同的节目。 这些就是PAT表和PMT表之间的关系。

TS流的格式

Structure of Transport Stream


TS流的包结构

TS流是基于Packet的位流格式,即由n个包组成;每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。 下图是一个TS流,以第k个包(Package)为例:

Packet Header(包头)信息说明
#标识位数说明
0sync_byte8 bits同步字节,固定是0x47
1transport_error_indicator1 bits错误指示信息(1:该包至少有1bits传输错误)
2payload_unit_start_indicator1 bits负载单元开始标志(packet不满188字节时需填充)
3transport_priority1 bits传输优先级标志(1:优先级高)
4PID13 bitsPacket ID号码,唯一的号码对应不同的包
5transport_scrambling_control2 bits加密标志(00:未加密;其他表示已加密)
6adaptation_field_control2 bits附加区域控制
7continuity_counter4 bits包递增计数器

上面表格是一个包(Package)的头(Header)的说明,其中需要注意的是:PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。 如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。

下表给出了一些表的PID值,这些值是固定的,不允许更改。

TS流中PID的分配
PID值说明
PAT0x0000-
CAT0x0001-
TSDT0x0002-
预留0x0003 至0x000F
NIT, ST0x0010-
SDT , BAT, ST0x0011-
EIT, ST0x0012-
RST, ST0x0013-
TDT, TOT, ST0x0014-
网络同步0x0015
预留使用0x0016 至 0x001B
带内信令0x001C
DIT0x001E
SIT0x001F

TS流中包(Packect)的包头结构

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

位号012345 6789101112 13141516171819 20212223242526 2728293031...
Packet(二进制) 0100 0111 0000 0111 1110 0101 0001 0010 ...
Packet(十六进制) 47 07 E5 12 ...
Packet Header信息 0: sync_byte=0x47 1234: PID (这里是0x07e5) 56 7 ...

拖动可显示更多数据

上表中,第一行为表头的位号(0-31,共32位), 第二行为每位的二进制数值, 第三行为每个字节的16进制数值, 最后一行对应上面的表格《Packet Header(包头)信息说明》的数据。下表是《Packet Header(包头)信息说明》的Demo数据

Packet Header(包头)信息Demo
#标识位数说明
0sync_byte8 bits固定是0x47
1transport_error_indicator1 bits值为0,表示当前包没有发生传输错误。错误指示信息(1:该包至少有1bits传输错误)
2payload_unit_start_indicator1 bits值为0,含义参考ISO13818-1标准文档。负载单元开始标志(packet不满188字节时需填充)
3transport_priority1 bits值为0,表示当前包是低优先级。传输优先级标志(1:优先级高)
4PID13 bitsPID=00111 11100101即0x07e5,是Video PID。Packet ID号码,唯一的号码对应不同的包
5transport_scrambling_control2 bits值为0x00,表示节目没有加密。加密标志(00:未加密;其他表示已加密)
6adaptation_field_control2 bits值为0x01,具体含义请参考ISO13818-1。附加区域控制
7continuity_counter4 bits值为0x02,表示当前传送的相同类型的包是第3个。包递增计数器


TS流中包(Packect)的包数据结构

TS流的包数据是承载实际数据的区域,根据不同的PID,有不同的解析方式。 下一节将以PAT表为例进行解析,本节暂不介绍。

TS流结构小结

回顾一下,TS流是一种位流(当然就是数字的), 它是由ES流分割成PES后复用而成的;它经过网络传输被机顶盒接收到; 数字电视机顶盒接收到TS流后将解析TS流。

TS流是由一个个Packet(包)构成的, 每个包都是由Packet Header(包头)和Packet Data(包数据)组成的。 其中Packet Header指示了该Packet是什么属性的,并给出了该Packet Data的数据的唯一网络标识符PID。

解析PAT表的数据包

Analyze the Package of PAT

下图是用码流分析软件得到的PAT表的数据包。

可以将上图的的数据这样划分:

包头(Package Header)包数据(Package Data)
47 40 00 1C00 B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 ... FF FF

注:表格内数据均为16进制数值。前4个字节为包头,后面的184个字节为包数据。


PAT表的包头

细分其表头(Package Header)数据(47 40 00 1C)如下:

位号012345 6789101112 13141516171819 20212223242526 2728293031...
Packet(二进制) 0100 0111 0100 0000 0000 0000 0001 1100 ...
Packet(十六进制) 47 40 00 1C ...
Packet Header信息 0*: sync_byte=0x47 1*2*3*4*: PID (这里是0x0000) 5*6* 7* ...

拖动可显示更多数据

上表中,第一行为表头的位号(0-31,共32位), 第二行为每位的二进制数值, 第三行为每个字节的16进制数值, 最后一行的数据说明参看下面的表格。

Packet Header(包头)信息Demo
#标识位数说明
0*sync_byte8 bits固定是0x47
1*transport_error_indicator1 bits值为0,表示当前包没有发生传输错误。错误指示信息(1:该包至少有1bits传输错误)
2*payload_unit_start_indicator1 bits值为1,含义参考ISO13818-1标准文档。负载单元开始标志(packet不满188字节时需填充)
3*transport_priority1 bits值为0,表示当前包是低优先级。传输优先级标志(1:优先级高)
4*PID13 bitsPID=0x0000,说明是PAT表。Packet ID号码,唯一的号码对应不同的包
5*transport_scrambling_control2 bits值为0x00,表示节目没有加密。加密标志(00:未加密;其他表示已加密)
6*adaptation_field_control2 bits值为0x01,具体含义请参考ISO13818-1。附加区域控制
7*continuity_counter4 bits值为0xC,表示当前传送的相同类型的包是第12个。包递增计数器

PAT表的包数据总览

该包的数据部分(Package Data)为:
00 B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

注意到这里有一个绿色的 00, 这是因为在包头后需要除去一个字节才是有效数据(payload_unit_start_indicator="1")。 因此,真正要分析的数据应该是红色部分:
B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF


解析前8个字节

下面对前8个字节(0-7字节,共计64 bits)进行分析:
B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号 0123 4567 891011 12131415 16171819 20212223 24252627 28293031 32333435 36373839 40414243 44454647 48495051 52535455 ...
Binary 0000 0000 1011 0000 0001 1101 0010 0010 0000 0001 1100 1111 0000 0000 ...
Hex 00 B0 1D 22 01 CF 00 ...
结构 0*: table_id=0x00 1*2*3*4*: section_length (这里是0x01D) 5*6* 7*8*9*10* ...

拖动可显示更多数据

#字段名占位具体值次序说明
0*table_id8 bits0000 0000(即0x00)第0个字节
00
PAT的table_id只能是0x00
1*section_syntax_indicator1 bit1

第1、2个字节
B0 1D
段语法标志位,固定为1
2*zero1 bit0
3*reserved2 bits11 (Binary)
4*section_length12 bits00 00 00 01 11 01(即0x1D,十进制值为29)意思是 段长度为29字节
5*transport_stream_id16 bits‭00 10 00 10 00 00 00 01‬(即0x2201)第3、4个字节
22 01
TS的识别号
6*reserved2 bits11

第5个字节
CF
TS的识别号
7*version_number5 bits0 01 11一旦PAT有变化,版本号加1
8*current_next_indicator1 bit1当前传送的PAT表可以使用,若为0则要等待下一个表
9*section_number4 bits00 00(即0x00)第6个字节
00
给出section号,在sub_table中,
第一个section其section_number为"0x00",
每增加一个section,section_number加一
10*last_section_number4 bits00 00(即0x00)第7个字节
00
sub_table中最后一个section的section_number
循环开始(循环内的数据解析见下一节内容!)
-program_number16 bits-----
-reserved3 bits-----
-network_id

program_map_PID
13 bits----program_number为0x0000时,
这里是network_id(NIT的PID);
其余情况是program_map_PID(PMT的PID)
循环结束
-CRC_3232 bits--最后4个字节-

解析循环部分

下面对后续几个字节(第8个字符开始)进行分析:
B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

在上一小节节的表格中,每一个循环都是4个字节(32 bits),我们在这里就先解析第一个循环:
B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号 0123 4567 891011 12131415 16171819 20212223 24252627 28293031 ...
Binary 0000 0000 0000 0000 1110 0000 0001 0000 ...
Hex 00 00 E0 10 ...
结构 1*: program_number = 0x0000 2*: reserved 3*: network_id = 0x10 ...

拖动可显示更多数据

#字段名占位具体值说明
1*program_number16 bits0x0000program_number = 0x0000
2*reserved3 bits111-
3*program_map_PID13 bits0x0000因为program_number为0x0000,
所以这里是network_id(NIT的PID)

继续解析下一个循环:
B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号 0123 4567 891011 12131415 16171819 20212223 24252627 28293031 ...
Binary 0100 0000 0001 0011 1110 0001 0011 0000 ...
Hex 40 13 E1 30 ...
结构 1*: program_number = 0x4013(即十进制16403) 2*: reserved 3*: program_map_PID = 0x130(即PMT_PID为0x130) ...

拖动可显示更多数据

#字段名占位具体值说明
1*program_number16 bits0x4013program_number = 0x4013(即十进制16403)
2*reserved3 bits111-
3*program_map_PID13 bits0x130因为program_number不为0x0000,
所以这里是program_map_PID = 0x130(即PMT_PID为0x130)

通过这个循环,我们可以知道,在这个TS中,有一个节目号为0x4013(即十进制16403)的节目,其PMT的PID为0x130。那么要想获取这个节目的详细信息,就要去解析PID为0x130的PMT表。(关于PMT表的解析可参看下一节内容)

为了不占用过多空间来显示这样重复的内容,关于更多循环的分析就不显示在正文,如果你仍想看,可以 点击这里显示或隐藏


循环汇总

将所有循环遍历完毕后,我们就能找出4个节目。下图是码流分析软件的截图。


PMT PID列表

下面表格是通过对PAT表分析后得到的数据。在分析完PMT表后,还可以对这张表进行补充,得到每个节目(Service)的名称。

#节目号PMT PID
1164030x130
2164080x180
3163940xA0
4163980xE0

PAT表包数据解析小结

对我们来说,PAT就是一个总入口。PAT告诉了我们,这个TS流中有几个节目,以及它们的PMT PID分别是多少。有了PMT的PID,我们就可以继续下一步了。

本章小结

Summary

本章对DVB及PSI/SI相关的知识作了细致的讲解,对初学者适用。

参考文档

References

#文档名称作者
1《PSI/SI教程:第一章:预备知识》林晓州
2《5.1数字电视信号复用与解复用概念》网络下载
3《ES、TS、PS流》网络下载

版本信息

Version Information

#发布日期版本更新内容作者审核
12016年02月24日V1.0整合了多个文档资料,对PSI/SI学习所需的知识进行系统的总结。林晓州——