本篇介绍下TS的封装格式。
TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。
TS文件分为三层,如下所示(可以倒序看更好理解):
◆ TS层(Transport Stream):在PES层基础上加入了数据流识别信息和传输信息。一个ts视频文件含有多个ts单元包。
◆ PES层(Packet Elemental Stream):在ES层基础上加入时间戳(PTS/DTS)等信息。每个ts单元含有一个pes头+多个es包。
◆ ES层(Elementary Stream):压缩编码后的音视频数据。
xB表示字节数不确定,4B表示字节数为4个。
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 Header格式如下:
◆ PID信息非常关键,它直接表征本次TS包的用途。比较重要的是PAT和PMT。常用的PID值:
如果PID为0x0,那么此ts的payload为PAT;如果为表中未列出的值,那么为分配给此ts包的一个唯一标识,用来区分ts包属于哪个节目。一个节目包含多个ts包。
PID取值 |
PID值使用描述 |
0x0000 |
节目关联表(program association table, PAT) |
0x0001 |
条件访问表(conditional access table, CAT) |
0x0002 |
传送流描述表(transport stream description table, TSDT) |
0x0003~0x000F |
保留 |
0x0010~0x1FFE |
可以分配为network PID, Program map PID, elementary PID, 或其它 |
0x1FFF |
空包(8191) |
在MPEG-2 TS中,为了传送打包后长度不足188B的不完整TS,或者为了在系统层插入节目时钟参考(program clock reference, PCR),需要在TS包中插入可变字节的调整字段。调整字段其中一个重要作用是解决编解码器的音视频同步问题。一般在视频帧中的TS包的调整字段中,每隔一定传输时间,传送系统时钟27MHz的一个抽样值给接收机,作为解码器解码时的时钟参考信息PCR。PCR通常每隔100ms至少被传输一次。PCR的数值所表示的是解码器在读完这个抽样值的最后那个字节时,解码器本地时钟所应处的状态。通常情况下,PCR不直接改变解码器的本地时钟,而是作为参考基准来调整本地时钟,使之与PCR趋于一致。
前边提到了PAT和PMT,它们都是PSI之一(节目专用信息(Program Special Information, PSI)。MPEG-2 TS传送的TS包携带两类信息:已压缩的音视频(PES)和与之相关的符号化表(PSI),由传送包PES的PID来标识。如果是PSI,那么payload内容为PAT表结构、PMT表结构;如果为音视频,那么payload内容为PES包。
如下为ts文件的PAT和PMT。PAT表指定节目列表以及节目对应的PID;PMT指定某节目的所有音视频流及其对应的PID。由下图右侧可知,PAT指出只有一个节目0x001,且此节目对应的PMT的PID为256;PMT指出0x001节目所有视频流PID为258,音频PID为257;左侧是ts文件的PAT PMT PID的统计。
(1)PAT表结构 (指明PMT表的PID值)
节目关联表(Program Association Table, PAT),得出所有节目的PID。N loop为一个数组,是节目列表及其对应的pid,每个节目就是指一段视频,具有唯一id。
(2)PMT表(指明音视频流的PID值)
PMT提供一路节目包含的所有原始码流的PID映射表。原始码流的PID从ts header的pid读取。
程序在读取N环的时候会读取该节目所有的码流列表及其PID,解析的时候可以根据PID来分离。N环描述符包括的信息如下图所示。节目时钟参考PCR的PID和视频的PID是相等的。由PAT得出所有的节目列表,选定收看的节目后,筛选出等于该节目PID的TS包,就可以得到该节目的所有码流的PID映射表,这样接收机就可以只接收PID等于该节目的码流的TS包即可收看该节目。
(3)补充说明
◆ 打包ts流时PAT和PMT表是没有调整字段的,不够的长度直接补0xFF即可。
◆ 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。
分组的原始码流,将原始码流ES流根据需要,分成⻓度不等的数据包,并加上包头就形成了打包的基本码流PES流。是⽤来传输ES的⼀种数据结构。
◆ PES(Packetized Elementary Stream,打包的ES),在 ES 层的基础上加入了时间戳(PTS/TDS)等信息。
◆ ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头,如下图所示
◆ PES packet length — 指示PES 包中跟随该字段最后字节的字节数。0 值指示PES 包长度既未指示也未限定并且仅在这样的PES 包中才被允许,该PES 包的有效载荷由来自传输流包中所包含的视频基本流的字节组成。
◆ PES结构如下:
◆ PES 关键字段说明
PES包的第5个字节标识一整个PES包的长度,一般来说,一个PES包包含一帧图像,获取了PES的包长度Len,当接收到Len个字节后,将接收到的字节组成一个block,放入FIFO中,等待解码线程解码。DTS和PTS也在PES包中传送。
◆ ES(Elementary Stream,基本码流),就是不分组的⾳频、视频或其他信息的连续码流,比如视频H.264,音频AAC。
◆ 一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。
两种方式都可以
(1) https://www.easyice.cn/archives/85
(2)链接:https://pan.baidu.com/s/1N3SA4UBjfL0KD67dN52qww 提取码:1234
http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8 m3u8播放地址 打开可查看是否可用
(1)打开网址,找到m3u8文件
发现文件里面还是m3u8文件
(2)拼接地址
将文件中的m3u8地址替换掉url中的最后一个m3u8文件名,然后继续访问。
(3)此时可看见ts文件
(4)拼接ts下载地址
用ts文件名替换掉url中的m3u8文件名。获得ts下载地址
(5)ts下载地址使用迅雷下载或者直接输入Google浏览器即可下载。
(1)使用EasyICE打开ts文件
可以看到ts文件的十六进制流。然后换算成二进制对比协议即可得出数据含义。FF是填充为,因为不满180字节,所以填充。
每行 为一个ts单元包,都包括ts、adaption field、payload。
(2)对照协议
左边为协议解释,右边浅蓝低为抓包到的十六进制数据。十六进制转换为二进制时需要一位一位转化,不能够两位十六进制转化。