封装格式--3:TS格式详解

“本文转载自
1.[音视频开发老马]的多媒体文件格式(四):TS 格式
2.[fang·up·ad]的视频封装格式篇(TS)

本文相关系列:

1.TS格式概述

1.1 简介

  TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。

先简要介绍一下什么是MPEG2-TS:
  DVD的音视频格式为MPEG2-PS,全称是Program Stream。而TS的全称则是Transport Stream。MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。这两种格式的主要区别是什么呢?简单地打个比喻说,你将DVD上的VOB文件的前面一截cut掉(或者干脆就是数据损坏),那么就会导致整个文件无法解码了,而电视节目是你任何时候打开电视机都能解码(收看)的。
  所以,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。
  我们可以看出,TS格式是主要用于直播的码流结构,具有很好的容错能力。通常TS流的后缀是.ts、.mpg或者.mpeg,多数播放器直接支持这种格式的播放。TS流中不包含快速seek的机制,只能通过协议层实现seek。HLS协议基于TS流实现的。

TS格式分析工具:EasyICE2.7.0.2 官方版

1.2 TS的分层结构

  TS文件(流)可以分为三层:TS层(Transport Stream)、PES层(Packet Elemental Stream)、ES层(Elementary Stream)。

  • TS层:PES层上加入了数据流识别和传输的必要信息,TS文件(码流)由多个TS Packet组成的。
  • PES层:打包的基本码流,把基本码流(ES)分割成段,并加上头部信息打包而成。
  • ES层:压缩编码后的音视频数据。基本码流,连续码流。

下图中显示了三层之间的关系:xB表示字节数不确定,4B表示字节数为4个。


ts_1.PNG

2.PSI/SI

2.1 PSI信息

  PSI是对单一TS流的描述,是TS流中的引导信息。

PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成。这些表会被插入到TS流中。PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目。

下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构。

ts_2.PNG

虽然这四个结构可以十分简单的表,但事实上,它们被进一步划分为各个段,并插入到TS包中。

2.2 PAT解析

这里我们注意关注五个字段:

ts_3.png

2.3 PAT的实例分析

下面给出的就是一个TS流的PAT分析情况:


ts_4.png

根据上表可以看出,这个TS流里共有6套节目,其映射关系PID分别为0xc9、0xcb、0xce、0xcc、0xcd和0xca。(注:0xc9=201)

  • 下面给出的是PMT的简单解析:
ts_5.png

两相比较,可以很清楚地知道,PAT是如何锁定各个PMT的(每个节目都有一个自己的PMT)。

  • Q1:如何找到一个特定的节目?

1.已知节目名称(或id等信息)
  首先要从节目关联表PAT中获取这个节目的节目映射表PMT的PID值,再从TS流中找出与此PID值相对应的节目映射表PMT;再从PMT中获取构成这个节目的基本码流的PID值,从而根据该PID过滤出相应的视频、音频和数据等基本码流。最后解码恢复为原始信号。

2.4 PMT解析

  PMT是连接节目号与节目元素的桥梁。

节目映射表PMT的意义在于,它给出了节目号与组成这个节目元素之间的映射;也就是说,PMT是连接节目号(PAT指定)与节目元素(音频和视频)的桥梁。我们知道,一个电视节目至少包含了视频和音频数据,而每一个节目的视音频数据都是以包的形式在TS流中传输的;所以说,一个TS流包含了多个节目的视频和音频数据包。要想过滤出一个TS流中其中一个节目的视频和音频,则需要知道这个节目中视频和音频的标识号PID。PMT表的作用就在于,它提供了每个节目视频、音频(或其他)数据包的PID。

2.5 PMT的表结构分析

这里着重介绍两个字段:

  • elementary_PID:标识了该节目(program_number)携带的基本流的识别号PID
  • stream_type:流类型,指出了PID为elementary_PID的基本流的类型

附:流类型取值说明

ts_6.png

2.6 PMT的实例分析

下面给出了码流分析仪分析一段TS流的PMT表:

ts_7.png

  首先,注意到这张PMT表的progam_number=0xc9,就是我们在上面解析PAT表得到的。
从上面可以知道,节目号为0xc9(即201)的节目有两个单元流:

ts_8.png

elementary_PID和stream_type的意义在于,告知接收机基本流的类型和识别PID。要想获取这个节目的视频,只需要对PID为0x21的数据包进行过滤,并交由视频处理模块处理。下图所示(除了节目名称,还需要SDT表信息)即为PAT和PMT共同获取的信息。

ts_9.png

2.7 PSI小结

ts_10.png

  上图给出了在一个TS流中PSI各表之间的联系。首先从PAT表出发,获取当前有哪些节目号(program_map_PID),再根据这些节目号找出program_number相同的PMT;获取到PMT后,即可根据elementary_PID和stream_type来确定要过滤哪些含有基本流的TS包,以及这些包里面是什么类型的数据。这样,机顶盒就可以过滤出相应的节目(视频和音频数据)来收看了。

3.TS层

  TS传输流,是由固定⻓度的包组成,含有独⽴时间基准的⼀个或多个节⽬,适⽤于误码较多的环境,并且从流的任意⼀段开始都可以独⽴解码。PS(Program Stream):节⽬流,PS流与TS流的区别在于,PS流的包结构是可变⻓度,⽽TS流的包结构是固定⻓度。

  • ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。
  • ts header固定4个字节;每188字节单元就有一个ts header。
  • adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充。
  • payload是 PES 数据,或者PAT,PMT等。PAT、PMT是解析ts寻找音视频流很重要的表。
  • ts Header + adaptation field 格式如下:
ts_11.png

3.1 TS Header

TS包的包头提供关于传输方面的信息。其格式如下:

ts_12.png
  • PID信息非常关键,它直接表征本次TS包的用途。比较重要的是PAT和PMT。常用的PID值:
ts_13.png

3.2 TS Adaptation Field

  在MPEG-2 TS中,为了传送打包后长度不足188B的不完整TS,或者为了在系统层插入节目时钟参考(program clock reference, PCR),需要在TS包中插入可变字节的调整字段。调整字段其中一个重要作用是解决编解码器的音视频同步问题。一般在视频帧中的TS包的调整字段中,每隔一定传输时间,传送系统时钟27MHz的一个抽样值给接收机,作为解码器解码时的时钟参考信息PCR。PCR通常每隔100ms至少被传输一次。PCR的数值所表示的是解码器在读完这个抽样值的最后那个字节时,解码器本地时钟所应处的状态。通常情况下,PCR不直接改变解码器的本地时钟,而是作为参考基准来调整本地时钟,使之与PCR趋于一致。

  • Adaptation Field的长度要包含传输错误指示符标识的一个字节。
  • PCR是节目时钟参考,PCR、DTS、PTS都是对同一个系统时钟的采样值,PCR是递增的,因此可以将其设置为DTS值,音频数据不需要PCR。
  • 打包TS流时PAT和PMT表是没有Adaptation Field的,不够的长度直接补0xff即可。
  • 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。
ts_14.png

3.3 TS Payload

在介绍TS Payload之前先理解一下PSI和SI:

  • PSI:Program Specific Information, 节目引导信息,在MPEG-2标准中定义的。
  • SI:Service Information, 业务信息,在DVB标准中定义的。

常见的有:

ts_15.png

  前边提到了PAT和PMT,它们都是PSI之一(节目专用信息(Program Special Information, PSI)。MPEG-2 TS传送的TS包携带两类信息:已压缩的音视频(PES)和与之相关的符号化表(PSI),由传送包PES的PID来标识。如果是PSI,那么payload内容为PAT表结构、PMT表结构;如果为音视频,那么payload内容为PES包。

  Program Association Table,节目关联表,是接收数据的入口点,解析TS的起点。

ts_16.png

  如下为ts文件的PAT和PMT。PAT表指定节目列表以及节目对应的PID;PMT指定某节目的所有音视频流及其对应的PID。由下图右侧可知,PAT指出只有一个节目0x001,且此节目对应的PMT的PID为256;PMT指出0x001节目所有视频流PID为258,音频PID为257;左侧是ts文件的PAT PMT PID的统计。

ts_17.png

(1)PAT表结构 (指明PMT表的PID值)

  节目关联表(Program Association Table, PAT),得出所有节目的PID。N loop为一个数组,是节目列表及其对应的pid,每个节目就是指一段视频,具有唯一id。

ts_18.png

(2)PMT表(指明音视频流的PID值)

  PMT提供一路节目包含的所有原始码流的PID映射表。原始码流的PID从ts header的pid读取。

ts_19.png

  程序在读取N环的时候会读取该节目所有的码流列表及其PID,解析的时候可以根据PID来分离。N环描述符包括的信息如下图所示。节目时钟参考PCR的PID和视频的PID是相等的。由PAT得出所有的节目列表,选定收看的节目后,筛选出等于该节目PID的TS包,就可以得到该节目的所有码流的PID映射表,这样接收机就可以只接收PID等于该节目的码流的TS包即可收看该节目。

ts_20.png

(3)补充说明

  • 打包ts流时PAT和PMT表是没有调整字段的,不够的长度直接补0xFF即可。
  • 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

4.PES 层

  分组的原始码流,将原始码流ES流根据需要,分成⻓度不等的数据包,并加上包头就形成了打包的基本码流PES流。是⽤来传输ES的⼀种数据结构。

  • PES(Packetized Elementary Stream,打包的ES),在 ES 层的基础上加入了时间戳(PTS/TDS)等信息。
  • ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头,如下图所示:
ts_21.png
  • PES packet length — 指示PES 包中跟随该字段最后字节的字节数。0 值指示PES 包长度既未指示也未限定并且仅在这样的PES 包中才被允许,该PES 包的有效载荷由来自传输流包中所包含的视频基本流的字节组成。
  • PES结构如下:
ts_22.png
  • PES 关键字段说明

  PES包的第5个字节标识一整个PES包的长度,一般来说,一个PES包包含一帧图像,获取了PES的包长度Len,当接收到Len个字节后,将接收到的字节组成一个block,放入FIFO中,等待解码线程解码。DTS和PTS也在PES包中传送。

ts_23.png

5.ES层

  • ES(Elementary Stream,基本码流),就是不分组的⾳频、视频或其他信息的连续码流,比如视频H.264,音频AAC。
  • 一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。

6.TS流生成及解析流程

6.1 TS 流生成流程

  1. 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。

  2. 对ES(基本码流)进行打包形成PES。

  3. 在PES包中加入时间戳信息(PTS/DTS)。

  4. 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。

  5. 在传输包中加入定时信息(PCR)。

  6. 在传输包中加入节目专用信息(PSI) 。

  7. 连续输出传输包形成具有恒定比特率的MPEG-TS流。

6.2 TS 流解析流程

  1. 复用的MPEG-TS流中解析出TS包;

  2. 从TS包中获取PAT及对应的PMT;

  3. 从而获取特定节目的音视频PID;

  4. 通过PID筛选出特定音视频相关的TS包,并解析出PES;

  5. 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;

  6. 将ES交给解码器,获得压缩前的原始音视频数据。

7.TS视频流分析

(1)使用EasyICE打开ts文件

  可以看到ts文件的十六进制流。然后换算成二进制对比协议即可得出数据含义。FF是填充为,因为不满180字节,所以填充。每行为一个ts单元包,都包括ts、adaption field、payload。

ts_24.png

(2)对照协议

  左边为协议解释,右边浅蓝低为抓包到的十六进制数据。十六进制转换为二进制时需要一位一位转化,不能够两位十六进制转化。

ts_25.png

8.参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容