版权声明:本文为CSDN博主「Kayson12345」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kayson12345/article/details/81266587
文章目录
#一.背景介绍
MPEG-TS一种标准数据容器格式,传输与存储音视频、节目与系统信息协议数据,应用于数字广播系统,譬如DVB,ATSC与IPTV。传输流在MPEG-2第1部分系统中规定,正式称为ISO / IEC标准13818-1或ITU-T建议书[1]。
MPEG2/DVB是一种多媒体传输、复用技术,在数字电视广播中可提供数百个节目频道。复用的含义是,可以同时传输多层节目。
注意,DVB全称为Digital Video Broadcasting,包括不同的系统,如卫星数字电视广播系统,有线数字电视广播系统,地面开路数字电视广播系统,交互式数字电视广播系统以及数字电视加扰系统。DVB系统标准是一种全球数字电视技术的标准。如何定义广播中的比特流语法与句法,以实现在比特流中复用数字音频与视频,欧洲的DVB采用数字视频压缩MPEG-2标准,该标准是定义比特流的语法与句法的一个ISO/IEC标准,即13818-1标准。DVB系统的核心技术是采用MPEG-2技术进行视频、音频的编码,使用统一的MPEG-2传输流(TS流)。
MPEG-2标准中,有两种不同的码流输出到信道,一种是节目码流(PS: Program Stream),适用于没有传输误差的场景;一种是传送流(TS:Transport Stream),适用于有信道噪声的传输场景。节目流设计用于合理可靠的媒体,如光盘(如DVD),而传输流设计用于不太可靠的传输,即地面或卫星广播。此外,传输流可以携带多个节目。
MPEG-2 system(编号13818-1)是MPEG-2标准的其中一部分,该部分描述了多个视频,音频和数据多种基本流(ES)合成传输流(TS)和节目流(PS)的方式。
#二.TS介绍
一路TS比特流通常由连续的固定字节的TS包组成,所包含的内容有:
一路或多路视频流(多个PES包组成,每个PES包的PID是一致的,一个PES包可能由若干个TS包组成)
一路或多路音频流(通常为杜比的音频格式)
一路或多路字幕
PSI表格信息(Program Specific Information,包括PAT与PMT表,即节目关联表与节目映射表)
PES: Packetized Elementary Stream,一路基本码流(如MEPG2视频流)会在编码器端被打包成PES流,由多个PES包组成,打包的过程中主要加入了PTS/DTS信息。
PAT描述有多少路节目,每路节目的PMT表的PID是多少,PMT则描述了本节目有多少流,每一路流的类型与PID是多少,举个例子,你找个一个TS包,它的PID是0,说明它的负载内容是PAT信息,解析PAT信息,你发现节目1的PMT表的PID是0x10,接着,你在比特流中寻找一个PID为0x10的TS包,它的负载内容是节目1的PMT表信息,解析该PMT信息,你可以发现第一路流是MPEG2音频流,PID号0x21,第二路流是MPEG2视频流,PID号是0x22,第三路流是DVB字幕流,PID号是0x23,解析完毕,凡是比特流中PID号为0x22的TS包,所负载的内容为MPEG2视频流,把这些包一个一个找出来,把其中的有效码流一部分一部分的拼接起来,然后送给解码器去解码。
注意,就一般的视频流而言,只要拼接成一个完整的PES包,就可以送出去给解码器,然后再继续拼接下一个PES包。
什么是ES流,PES流,TS流?
ES流:有三种,图像数据流,音频数据流,以及其他编码数据流。
PES流:PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息等操作(对ES流的第一次打包)。PES流的基本单位是PES包。
TS流:由定长的TS包组成(188字节),而TS包是对PES包的一个重新封装(到这里,ES经过了两层的封装) 。应用于相对有错环境下的传输与存储(如DVB中),其基本单位是TS包,长度固定188字节。日本的DVB-S广播系统采用192个字节的TS包,美国采用204个字节的TS包,多加了16个字节的前向纠错校验码(FEC)。
Fig. 1. ES流打包成PES流(来自未知原始出处的网络资料TS码流结构分析[3])
Fig. 2. PES流打包成TS流(来自未知原始出处的网络资料TS码流结构分析[3])
什么是PSI表?
PSI,节目特定信息,该表格信息用来描述传送流的组成结构。PSI信息由四种类型的表组成,包括节目关联表(PAT),节目映射表(PMT),条件接收表(CAT),网络信息表(NIT)。PAT与PMT两张表帮助我们找到该传送流中的所有节目与流,PAT告诉我们,该TS流由哪些节目组成,每个节目的节目映射表PMT的PID是什么,而PMT告诉我们,该节目由哪些流组成,每一路流的类型与PID是什么。CAT与NIT暂时不考虑。
Fig. 3. PSI表[2]
#三.TS解封装的原理
TS流的形成过程:
将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
对ES(基本码流)进行打包形成PES。
在PES包中加入时间戳信息(PTS/DTS)。
将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
在传输包中加入定时信息(PCR)。
在传输包中加入节目专用信息(PSI) 。
连续输出传输包形成具有恒定比特率的MPEG-TS流。
TS流的解析过程,可以说是生成的逆过程:
从复用的MPEG-TS流中解析出TS包;
从TS包中获取PAT及对应的PMT(PSI中的表格);
从而获取特定节目的音视频PID;
通过PID筛选出特定音视频相关的TS包,并解析出PES;
从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;
将ES交给解码器,获得压缩前的原始音视频数据
#四.TS格式详解
##1.TS包格式
TS包主要由两部分组成,一是4个字节的包头信息,二是有效载荷,另外中间有可能插入自适应调整字段。有效载荷包括节目专用信息,打包后的流数据,以及业务信息。
Fig. 4. TS包的组成结构[2]
TS的语法结构如下:
Fig. 5. TS的语法结构[2]
主要的字段解析如下:
Sync byte:同步字节,值为0x47;
Transport error indicator:传输错误指示位,置1时,表示传送包中至少有一个不可纠正的错误位。
Payload unit start indicator:负载单元起始指标位,表示TS包的有效净荷以PES/PSI包的第一个字节开始,举个例子,一个PES包可能由多个TS包构成,第一个TS包的负载单元起始指标位才会被置位。
Transport priority:传输优先级,表明该包比同个PID的但未置位的TS包有更高的优先级。
PID:该TS包的ID号,如果净荷是PAT包,则PID固定为0x00。
Transport scrambling control:传输加扰控制位
Adaption field control:自适应调整域控制位,置位则表明该TS包存在自适应调整字段。
Continuity counter:连续计数器,随着具有相同PID的TS包的增加而增加,达到最大时恢复为0,如果两个连续相同PID的TS包具有相同的计数,则表明这两个包是一样的,只取一个解析即可。
Payload:负载内容,可能为PAT/PMT/PES。data_byte为1B长度的数据,为负载字节。
Fig. 6. TS的语法结构代码示意
##2.PAT格式
PAT的语法结构如下:
Fig. 7. PAT的语法结构示意[2]
主要的字段解析如下:
table_id: 标识一个TS PSI 分段的内容是节目关联分段,条件访问分段还是节目映射分段。对于PAT,置为0x00。
section_syntax_indicator: 对于PAT,置为0x01。
section_length: 分段长度字段,其值为从section_length(包括在内)到CRC_32字段的字节数,其值不超过1021。
transport_stream_id: 区别与其他复用流的标识。
version_number: PAT的版本号,如果PAT有变,则版本号加1。
current_next_indicator:置0时,表明该传送的表分段不能使用,下一个表分段才有效。
section_number: 表明该TS包属于该PAT的第几个分段,分段号从0开始。
last_section_number: 表明最后一个分段号,同时表明该PAT的最大分段数目。一般,一个PAT表由一个TS包传送。
program_number: 节目的编号。
network_PID: NIT表的PID值。
program_map_PID: PMT表的PID值。
CRC_32: CRC校验。
Fig. 8. PAT语法结构代码示意
##3.PMT格式
PMT的语法结构如下:
Fig. 9. PMT语法结构[2]
主要的字段解析如下:
table_id: 标识一个TS PSI 分段的内容是节目关联分段,条件访问分段还是节目映射分段。对于PMT,置为0x02。
section_syntax_indicator: 对于PMT,置为0x01。
section_length: 分段长度字段,其值为从section_length(包括在内)到CRC_32字段的字节数,其值不超过1021。
program_number: 表明一共有多少个节目。
version_number: PMT的版本号,如果字段中有关信息有变,则版本号以32为模加1。版本号是对一个节目的定义。
current_next_indicator:置0时,表明该传送的表分段不能使用,下一个表分段才有效。
section_number: 总为0x00。
last_section_number: 总为0x00。
PCR_PID: 指示含有该节目的PCR字段的TS包的PID。
program_info_length: 表明跟随其后的对节目信息描述的字节数,也就是第一个N loop descriptors的字节数。
stream_type: 表明PES流的类型。譬如,0x01表明是MPEG-1视频,0X03表明是MPEG-1音频。
elementary_PID: 表明该负载有该PES流的TS包的PID值。
ES_info_length: 表明跟随其后的描述相关节目元素的字节数,也就是第二个N loop descriptors的字节数。
CRC_32: 在CEDARX代码中仅对DVB的场景下作校验。
Fig. 10. PMT的语法结构代码示意
##4.PES格式
PES的语法如图10所示,它携带的主要信息包括流的ID,PES包的长度,PTS以及流的数据,也就是音视频与字幕数据。
主要的字段解析如下:
packet_start_code_prefix: 固定0x000001
stream_id: 指定基本流的类型与编号
PES_packet_length: 表明在该字段后面还有多少个字节。0表明PES包的长度未指示也未限定,对于当前的PES包而言。
PES_scrambling_control: PES包的有效载荷的加扰方式。
PES_priority: 多路复用器可以通过该位最优化基本流内的数据。
data_alignment_indicator:
copyright: PES包中的有效载荷确定具有版权的话,就置位。
orginal_or_copy: 置位时,表明PES包的有效载荷的内容是原始的,非复制的。
PTS_DTS_flags: 2比特字节,表明PTS/DTC的存在情况。
ES_rate_flag: 置位,表明后面存在ES_rate字段。
PES_header_data_length: 表明该PES包头中由任选字段与填充字节所占据的字节总数。任选字段譬如ES_rate。
marker_bit: 为1的比特位。
PTS: 对于音频而言,如果该PES包中存在PTS字段,则有效负载中肯定有新的音频存取单元(access unit),该PTS对应于该音频存取单元。新的音频存取单元指的是一帧新的音频帧。对于视频而言,一般情况下,跟音频一样。
DTS: 解码时间标志,当前CEDARX解码器未用到DTS。
ES_rate: 基本流速率,指定系统目标解码器接收PES包字节的速率。
Fig. 11. PES的语法结构代码
#五.参考资料
[1] ISO / IEC标准13818-1或ITU-T建议书 http://www.itu.int/rec/T-REC-H.222.0
[2] 《数字电视业务信息及其编码》,方涛,国防工业出版社
[3] https://wenku.baidu.com/view/87f5439c2f60ddccdb38a066.html?rec_flag=default
[4] TS码流结构分析PPT,网络资料
————————————————
版权声明:本文为CSDN博主「Kayson12345」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kayson12345/article/details/81266587
网友评论