MPEG-TS 格式解析

版权声明:本文为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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335