文章目录

#一.背景介绍

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流的形成过程:

  1. 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
  2. 对ES(基本码流)进行打包形成PES。
  3. 在PES包中加入时间戳信息(PTS/DTS)。
  4. 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
  5. 在传输包中加入定时信息(PCR)。
  6. 在传输包中加入节目专用信息(PSI) 。
  7. 连续输出传输包形成具有恒定比特率的MPEG-TS流。

TS流的解析过程,可以说是生成的逆过程:

  1. 从复用的MPEG-TS流中解析出TS包;
  2. 从TS包中获取PAT及对应的PMT(PSI中的表格);
  3. 从而获取特定节目的音视频PID;
  4. 通过PID筛选出特定音视频相关的TS包,并解析出PES;
  5. 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;
  6. 将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,网络资料

MPEG-TS 格式解析相关推荐

  1. 从mpeg ts文件中提取I帧(1):将ts包拼装为section或pes包

    写在前面的话:         不觉中已经在数码工作了十年有余,十年的青春.十年的汗水,如今即将离开,个中滋味难以言表! 以后可能不会在广电行业工作了,就用这个小程序,为自己十年的广电工作画上一个句号 ...

  2. MPG(MPEG2 Program Stream)格式解析

    参考自: https://blog.csdn.net/yu_yuan_1314/article/details/11477261 https://blog.csdn.net/dancing_night ...

  3. TS流解析【PCR】自己的总结

    http://www.cnblogs.com/ztteng/articles/3166025.html http://blog.csdn.net/liuhongxiangm/article/detai ...

  4. 视频基础知识:告别菜鸟 高清视频编码及封装格式解析

    告别菜鸟 高清视频编码及封装格式解析 在如今的互联网时代,对于全高清视频文件来说,非常容易获取.不像以前在拨号上网的年代,可谓是资源匮乏,平时电脑看个VCD,就已经觉得是比较出色的画质了.时代在发展, ...

  5. 多媒体文件格式:TS 格式

    一.TS 格式标准介绍 TS是一种音视频封装格式,全称为MPEG2-TS.其中TS即"Transport Stream"的缩写. 先简要介绍一下什么是MPEG2-TS: DVD的音 ...

  6. 多媒体文件格式-TS格式

    一.TS 格式标准介绍 TS是一种音视频封装格式,全称为MPEG2-TS.其中TS即"Transport Stream"的缩写. 先简要介绍一下什么是MPEG2-TS: DVD的音 ...

  7. TS流解析 二 *****

    1.TS格式介绍 TS:全称为MPEG2-TS.TS即"Transport Stream"的缩写.它是分包发送的,每一个包长为188字节(还有192和204个字节的包).包的结构为 ...

  8. avs3 ts格式封装 标准_超能课堂(204):多媒体容器格式变迁录

    从照相机.留声机诞生,解决了人们记录影像.声音的需求以来,人们就不断地追求着在有限的条件下尽可能地提高这些记录的品质,而从模拟时代过渡到数字时代以后,这方面的追求有一部分变成了在尽可能小的空间中提供尽 ...

  9. CedarX中代码技术的应用借鉴 (二)多态的方式创建格式解析器

    前言 CedarX是全志科技开源的多媒体SDK,其解码的调用基于自研的解码器接口,向上可对接MediaPlayer接口.本文记录与分析其源代码中对于C语言方面的代码技术的应用,仅作记录与借鉴. 源码参 ...

最新文章

  1. at24c16如何划分出多个读写区_如何1分钟遍历100T数据?
  2. Xshell实现Windows上传文件到Linux主机
  3. REST API URI 设计的七准则
  4. Disjoint Set
  5. 寒冬悟道者马云:阿里巴巴逢单出击(4)
  6. shell脚本详解(七)——正则表达式、sort、uniq、tr
  7. 程序员过关斩将--论商品促销代码的优雅性
  8. python中range语法
  9. PHP用set_error_handler()拦截程序中的错误
  10. java监听鼠标接口实现_自定义Java鼠标监听器?
  11. C++ STL 容器的合并、求差集、交集等操作实例 含详细注释版
  12. day_work_01
  13. GB28181国标协议
  14. 《精通Linux设备驱动程序开发》——音频驱动程序
  15. 重磅!汇新云88会员节福利大放送
  16. 计算机如何在文段中插入符号,插入项目符号与编号(Word 2013基础)——想象力电脑应用...
  17. 面试准备—任重而道远
  18. git常用命令(持续更新)
  19. 返回到上一个页面并刷新页面
  20. 学网页平面UI设计让你挑战高薪

热门文章

  1. 40页PPT详解:京东大数据基础构架与创新应用
  2. python中转义符的用法大全_Python中的各种转义符\n\r\t
  3. 开发者的拯救者还是掘墓人?解密低代码开发平台
  4. 我心中的计算机作文500,我心中的太阳作文500字(通用10篇)
  5. Python实现对文件内容进行加密
  6. 制作在线单词测试的软件,推荐几个在线测试英语单词量的网站
  7. python主进程 子进程_Python关闭主进程时关闭子进程
  8. html标签属性可以省略,html部分---通用标签与属性;
  9. combo 口切换配置
  10. 主干光缆线路的组网结构