[时间:2016-07] [状态:Open]

TS流是MPEG-2标准中定义一种用于直播的码流结构,具有很好的容错能力。所有跟TS相关的标准可以从ISO/IEC_13818-1中找到。

通常TS流的后缀是.ts、.mpg或者.mpeg,多数播放器直接支持这种格式的播放。

0. 学习多媒体容器格式的目的

主要是为了回答以下问题:

  1. 该容器中数据是如何组织的?
  2. 该容器包含哪些编码格式的数据?这些数据是如何存储的?
  3. 该容器包含哪些元数据信息?包含哪些节目信息?
  4. 对于支持多节目的容器格式,如何找到对应的音频流、视频流、字幕流?
  5. 如何确定该容器的节目播放时长?
  6. 如何从该容器中提取音频、视频、字幕数据,并交给解码器解码,有时间戳否?
  7. 该容器是否支持seek?有哪些辅助信息?
  8. 是否支持直接流化?
  9. 哪里可以找到该容器格式最标准的文档资料?
  10. 有哪些可用的工具,方便分析容器格式异常或者错误?

1. 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交给解码器,获得压缩前的原始音视频数据。

2. TS码流整体结构

MPEG-2中规定TS传输包的长度是固定的,长度为188字节。标准规定每个TS包只能包含一个基本流的数据,不存在跨基本流的情况。

所有的TS包都分为包头和净荷部分。TS包中可以填入很多东西(填入的东西都是填入到净荷部分),有:视频、音频、数据(包括PSI、SI以及其它任何形式的数据)。TS只是传输层的协议,所以比较多的面向错误处理的误码纠正。

用c语言描述下MPEG-TS码流,如下:

MPEG_transport_stream() {
do {
transport_packet()
} while (nextbits() == sync_byte)
}

下图是对TS码流的一个分层结构:

TS包头

TS包的包头提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。TS包的包头长度不固定,前32比特(4个字节)固定,后面可能跟有自适应字段(适配域)。32个比特(4个字节)是最小包头。包头的结构固定如下:

各字段含义如下:

  • sync_byte(同步字节):固定为0x47;该字节由解码器识别,使包头和有效负载可相互分离。
  • transport_error_indicator(传输错误标志):‘1’表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。
  • payload_unit_start_indicator(负载起始标志):为1时,表示当前TS包的有效载荷中包含PES或者PSI的起始位置;在前4个字节之后会有一个调整字节,其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。
  • transport_priority(传输优先级标志):‘1’表明当前TS包的优先级比其他具有相同PID, 但此位没有被置‘1’的TS包高。
  • PID:指示存储与分组有效负载中数据的类型。PID值0x0000—0x000F保留。其中0x0000为PAT保留;0x0001为CAT保留;0x1fff为分组保留,即空包。标准中定义的PID分配见下表:
PID值 描述
0 PAT(Program Association Table)
1 CAT(Conditional Access Table)
3-0xF Reserved
0x10-0x1FFE 自定义PID,可用于PMT的pid、network的pid或者其他目标
0x1FFF 空包
- 注意PCR的PID可以选择0、1或者0x10-0x1FFE的任意值。
  • transport_scrambling_control(加扰控制标志):表示TS流分组有效负载的加密模式。空包为‘00’,如果传输包包头中包括调整字段,不应被加密。其他取值含义是用户自定义的。
  • adaptation_field_control(适配域控制标志):表示包头是否有调整字段或有效负载。‘00’为ISO/IEC未来使用保留;‘01’仅含有效载荷,无调整字段;‘10’ 无有效载荷,仅含调整字段;‘11’ 调整字段后为有效载荷,调整字段中的前一个字节表示调整字段的长度length,有效载荷开始的位置应再偏移[length]个字节。空包应为‘10’。
  • continuity_counter(连续性计数器):随着每一个具有相同PID的TS流分组而增加,当它达到最大值后又回复到0。范围为0~15。

关于adaption_filed字段建议参考标准文档的ch2.4.3.4 Adaptation field一节。

TS包负载部分

TS包中净荷所传输的信息包括两种类型:

  • 视频、音频的PES包以及辅助数据;
  • 节目专用信息PSI。

当然,TS包也可以是空包。空包用来填充TS流,可能在重新进行多路复用时被插入或删除。

在系统复用时,视频、音频的ES流需进行打包形成视频、音频的 PES流,辅助数据(如图文电视信息)不需要打成PES包。

3. 节目专用信息PSI(Program Specific Information)

在TS流中传输的主要有四类表格,其中包含了解复用和显示节目相关的信息。

节目信息的结构性的描述如下;

  • 节目关联表Program Association Table (PAT) 0x0000
  • 节目映射表Program Map Tables (PMT)
  • 条件接收表Conditional Access Table (CAT) 0x0001
  • 网络信息表Network Information Table(NIT) 0x0010
  • 传输流描述表Transport Stream Description Table(TSDT) 0x02

其中PMT中定义了与特定节目相关的PID信息,比如音频包pid、视频包pid以及pcr的pid;CAT表格用于流加扰情况下配置参数;NIT是可选的,标准中未详细定义;TSDT也是可选的。

这些表格信息保存到TS中,需要先切分成section,然后放到TS包中。

这里仅详细说明PAT和PMT表的构成,其他表格建议参考标准文档。

PAT表

TS流中会定期出现PAT表。PAT表提供了节目号和对应PMT表格的PID的对应关系。

其具体结构如下图:

第一个字段table_id,8位,用于标识PSI section负载数据的类型。其取值含义如下:

Value description
0x00 program_association_section
0x01 conditional_access_section (CA_section)
0x02 TS_program_map_section
0x03 TS_description_section
0x04 ISO_IEC_14496_scene_description_section
0x05 ISO_IEC_14496_object_descriptor_section
0x06-0x37 ITU-T Rec. H.222.0 / ISO/IEC 13818-1 reserved
0x38-0x3F Defined in ISO/IEC 13818-6
0x40-0xFE User private
0xFF forbidden

PAT中定义的节目号(program_number)与PMT_PID的映射。当节目号为0时,存储的是network_PID。

详细定义建议参考2.4.4.3 Program association Table一节。

PMT表

PMT在传送流中用于指示组成某一套节目的视频、音频和数据在传送流中的位置,即对应的TS包的PID值,以及每路节目的节目时钟参考(PCR)字段的位置。

其结构定义如下:

其中的stream_type标识了对应pid的类型,比如音频、视频或者其他类型(具体建议参考2.4.4.9 Semantic definition of fields in Transport Stream program map section一节)。

4. PES包

PES包使用固定的24位起始码0x000001和一个8为的stream-id,用于说明当前包的类型。PES包中可以包含DTS/PTS等时间戳信息。整体结构如下图:

PES包非定长,音频的PES包小于等于64K,视频的一般为一帧一个PES包。一帧图象的PES包通常要由许多个TS包来传输。MPEG-2中规定,一个PES包必须由整数个TS包来传输。如果承载一个PES包的最后一个TS包没能装满,则用填充字节来填满;当下一个新的PES包形成时,需用新的TS包来开始传输。

PES包的结构如下:

PES_packet() {
packet_start_code_prefix : 24
stream_id : 8
PES_packet_length: 16
optional_pes_header
pes_packet_data
}
  • packet_start_code_prefix:24位起始码,固定必须是'0000 0000 0000 0000 0000 0001' (0x000001)。用于标识包的开始。
  • stream_id:在PS流中该字段标识其存储的基本流的类型和索引号,在TS流中该字段仅标识其存储的基本流的类型。
  • PES_packet_length:16位,用于存储PES包的长度。
  • optional_pes_header需要视stream_id类型而定,其长度不固定(这里包含DTS/PTS时间戳信息)。
  • pes_packet_data其长度是PES_packet_length定义的长度值。

最后两个字段的解析,建议参考标准文件的2.4.3.7 Semantic definition of fields in PES packet一节。

5. 其他问题

TS流是我接触的第一个封装格式,也是经过很长时间才完全整明白具体的解码流程。

本文不涉及太多的细节问题。很明显TS流中不包含快速seek的机制,只能通过协议层实现seek。

分析TS流建议使用TsAnalyse等现有的工具,在广电普遍使用的TS流,有较多的现成工具。新出来的HLS协议也是基于TS流实现的。

参考资料

  1. ISO/IEC_13818-1
  2. MPEG-2 TS码流分析

多媒体文件格式之TS的更多相关文章

  1. 多媒体文件格式(一):MP4 格式

    在互联网常见的格式中,跨平台最好的应该就属MP4文件了.因为MP4文件既可以在PC平台的Flashplayer中播放,又可以在移动平台的Android.iOS等平台中进行播放,而且使用系统默认的播放器 ...

  2. 多媒体文件格式分析 MP3文件结构及编解码流程

    多媒体文件格式分析 http://blog.csdn.net/taniya001/article/details/7962864 多媒体文件格式分析 MP3文件结构及编解码流程 http://www. ...

  3. 多媒体文件格式(四):TS 格式

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

  4. 多媒体文件格式之AVI

    [时间:2016-07] [状态:Open] AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件 ...

  5. 多媒体文件格式之RMVB

    [时间:2016-07] [状态:Open] RM/RMVB是Real公司私有的封装格式,常见的后缀形式是rm.ra.rmvb. 通常封装的都是real转悠的编码格式,比如音频中的sipro.cook ...

  6. 多媒体文件格式之FLV

    [时间:2016-07] [状态:Open] FLV是一个相对简单的多媒体格式,仅支持单节目,也就是说每个FLV只能至多一个音频.至多一个视频.FLV(Flash Video)是Adobe的一个免费开 ...

  7. 多媒体文件格式之MKV

    [时间:2016-07] [状态:Open] MKV是一种开源的多媒体封装格式,是Matroska中应用比较多的格式之一.常见的后缀格式是.mkv(视频,包括音频和字幕)..mka(纯音频)..mks ...

  8. 多媒体文件格式之MP4

    [时间:2016-06] [状态:Open] 学习多媒体容器格式的目的 主要是为了回答以下问题: 该容器中数据是如何组织的? 该容器包含哪些编码格式的数据?这些数据是如何存储的? 该容器包含哪些元数据 ...

  9. 多媒体文件格式之ASF

    [时间:2016-06] [状态:Open] ASF,全称Advanced Systems Format,是由微软提出的开放封装格式标准.ASF是微软公司Windows Media的核心.这是一种包含 ...

随机推荐

  1. mac安装thrift

    一.安装brew包管理工具 不想Ubuntu自带apt,redhat自带yum,mac是不自带包管理工具的.需要自己安装,最常用的是brew,Homebrew简称brew,OSX上的软件包管理工具,在 ...

  2. maven groupID 和 ArtifactID的区别与作用

    GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称.一般Gro ...

  3. IO 多路复用是什么意思?

    在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流, (学过EE的人现在可以站出来义正严辞说这个叫“时分复用”了). 什么,你还没有搞懂“一个请求到来了,nginx使用epoll接收请求的过 ...

  4. 合格linux运维人员必会的30道shell编程面试题及讲解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1632876 超深度 ...

  5. k8s实战之数据卷(volume)

    一.概述 数据卷用于实现容器持久化数据,k8s对于数据卷重新定义,提供了丰富强大的功能:数据卷分为三类: 本地数据卷,网络数据卷和信息数据卷 二.

  6. Win10企业版转专业版

    原文地址:https://jingyan.baidu.com/article/86112f136624322737978797.html 转换ISO镜像下载地址: ed2k://|file|cn_wi ...

  7. 【Algorithm】快速排序(续)

    前面在常用的排序算法中,已经写过一篇关于快速排序算法的博客,但是最近看到<The C Programming Language>这本书中的快速排序算法写的不错,所以就拿过来分享一下,下面我 ...

  8. 【转】Swift 语言的设计错误

    Swift 语言的设计错误 在『编程的智慧』一文中,我分析和肯定了 Swift 语言的 optional type 设计,但这并不等于 Swift 语言的整体设计是完美没有问题的.其实 Swift 1 ...

  9. appium简明教程(10)——控件定位基础

    狭义上讲,UI级的自动化测试就是让机器代替人去点来点去的过程. 但机器去点什么(点上面还是点左边),怎么点(是长按还是轻触),这些东西是必须由代码的编写者所指示清楚的. 控件定位就是解决机器点什么的问 ...

  10. 跟我学SharePoint 2013视频培训课程——怎样创建文档库并上传文档(8)

    课程简介 第8天,怎样在SharePoint 2013怎样创建文档库并上传文档. 视频 SharePoint 2013 交流群 41032413