分享

MPEG-TS 格式解析

 开花结果 2021-12-02

#一.背景介绍

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)的方式。

音频数据和视频数据经压缩编码后形成音频基本流(ES:Elementary Stream)和视频基本流。基本流经过打包、附加某些必要信息后,形成打包基本流(PES:Packetized Elementary Stream)。音频和视频打包基本流经节目流复合器可以形成节目流,也可以经传输流复合器形成传输流。

PES Packet

Program Stream

Transport Stream

 #二.TS介绍

一路TS比特流通常由连续的固定字节的TS包组成,所包含的内容有:

一路或多路视频流(多个PES包组成,每个PES包的PID是一致的,一个PES包可能由若干个TS包组成)

一路或多路音频流(通常为杜比的音频格式)

一路或多路字幕

单个节目的音频单元流(A-ES)和视频单元流(V-ES)复合成MPEG-2系统流的过程如下图所示:

PSI表格信息(Program Specific Information,包括PAT与PMT表,即节目关联表与节目映射表)

MEPG-2标准的系统部分重点描述了MPEG-2系统级传输流中包含的PSI(Program Specific Information)信息。PSI信息能提供从复用器到接受机的节目配置,复用及解复用不同的节目码流的必要信息。

MPEG-2中定义的PSI信息主要有:描述多路节目复接信息的PAT表(Program Associate Table,节目关联表);描述单路节目复接信息的PMT表(Program Map Table,节目映射表);描述条件接收信息的CAT表(Conditional Access Table,条件接收表);提到但未具体定义NIT表(Network Information Table,网络信息表);并定义了用于扩充PSI信息的私有表的语法。

PAT节目关联表

  

节目关联表(PAT Program Association Table)是数字电视系统中节目指示的根节点。其包标识符(Packet IDentifier、简称PID)为0。终端设备(如机顶盒)搜索节目时最先都是从这张表开始搜索的。从PAT中解析出节目映射表(PMT),再从PMT解析出基本元素(如视频、音频、数据等)的PID及节目号、再根据节目从节目业务描述表(Service Description Table、简称SDT)中搜索出节目名称。

PMT节目映射表

  

节目映射表(PMT,Program Map Table),该表的PID是由PAT提供给出的。通过该表可以得到一路节目中包含的信息,例如,该路节目由哪些流构成和这些流的类型(视频,音频,数据),指定节目中各流对应的PID,以及该节目的PCR所对应的PID。

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./rec/T-REC-H.222.0

[2] 《数字电视业务信息及其编码》,方涛,国防工业出版社

[3] https://wenku.baidu.com/view/87f5439c2f60ddccdb38a066.html?rec_flag=default

[4] TS码流结构分析PPT,网络资料

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多