
[时间: 2016-07] [状态: 打开]
TS流是在MPEG-2标准中为实时广播定义的流结构,具有良好的容错能力. 与TS相关的所有标准都可以在ISO / IEC_13818-1中找到.
TS流的后缀通常是.ts,.mpg或.mpeg. 大多数播放器直接支持这种格式.
主要回答以下问题:
该容器中的数据如何组织?容器包含哪些编码格式数据?该数据如何存储?容器包含哪些元数据信息?包含哪些计划信息?对于支持多个程序的容器格式ts文件音频,如何找到相应的音频流,视频流,字幕流?如何确定容器程序的持续时间?如何从容器中提取音频,视频和字幕数据并将其提供给进行解码,是否带有时间戳?是否寻求集装箱支撑?有什么辅助信息?是否支持直接流式传输?在哪里可以找到有关容器格式的最标准文档?哪些工具可用来帮助分析容器格式异常或错误?
TS流的形成过程:
1. 压缩原始音频和视频数据后,压缩结果形成基本流(ES).
2. 将ES(基本流)打包成PES.
3. 在PES数据包中添加时间戳信息(PTS / DTS).
4. 将PES数据包的内容分配为一系列固定长度的传输数据包(TS数据包).
5. 在传输包中添加定时信息(PCR).
6. 将程序特定信息(PSI)添加到传输包中.
7. 连续输出传输数据包以形成恒定比特率的MPEG-TS流.
TS流的分析过程可以说是生成过程的逆过程:
分析来自复用的MPEG-TS流的TS数据包;从TS分组中获取PAT和对应的PMT(PSI表);从而获得特定程序的音频和视频PID;通过PID相关TS包过滤出特定的音频和视频,并解析出PES;从PES读取PTS / DTS,并从PES解析出基本流ES;在压缩之前将ES提供给以获取原始音频和视频数据.

在MPEG-2中指定的TS传输包的长度是固定的,并且该长度是188个字节. 该标准规定,每个TS数据包只能包含一个基本流的数据,而没有交叉基本流.
所有TS数据包都分为报头和有效负载. TS包可以填充很多东西(填充到有效载荷部分中)ts文件音频,包括: 视频,音频,数据(包括PSI,SI和任何其他形式的数据). TS只是传输层的协议,因此对于错误处理有更多的错误纠正.
用c语言描述MPEG-TS代码流,如下所示:
MPEG_transport_stream() {
do {
transport_packet()
} while (nextbits() == sync_byte)
}
以下图片是TS代码流的分层结构:

TS数据包的报头提供有关传输的信息: 同步,错误存在,加扰,PCR(程序参考时钟)和其他符号. TS数据包报头的长度不是固定的,前32位(4个字节)是固定的,并且可以跟随适配字段(自适应字段). 32位(4字节)是最小的数据包头. 包头的结构固定如下:

每个字段的含义如下:
PID值说明
PAT(节目关联表)
CAT(有条件访问表)
3-0xF
保留
0x10-0x1FFE

自定义PID,可用于PMT pid,网络pid或其他目标
0x1FFF
空包
请注意,PCR的PID可以是0、1或0x10-0x1FFE中的任何值.
对于adaptive_filed字段,请参阅标准文档的ch2.4.3.4 Adaptation字段部分.
TS数据包中有效负载传输的信息包括两种类型:
当然,TS数据包也可以是空数据包. 空数据包用于填充TS流,并且在再次执行多路复用时可以被插入或删除.
在对系统进行多路复用时,视频和音频ES流需要打包以形成视频和音频PES流,并且不需要将辅助数据(例如图文电视信息)打包到PES数据包中.
TS流中传输的表有四种主要类型,其中包含与理解多路复用和显示程序有关的信息.
节目信息的结构说明如下;
PMT定义与特定程序相关的PID信息,例如音频包pid,视频包pid和pcr pid; CAT表用于在流加扰的情况下配置参数. NIT是可选的,不包括在标准“详细定义”中; TSDT也是可选的.
这些表中的信息保存在TS中,需要将其分为几部分,然后放入TS包中.
这里仅是PAT和PMT表结构的详细说明,建议其他表参考标准文档.
PAT表将定期出现在TS流中. PAT表提供了程序号和与PMT表相对应的PID之间的对应关系.
具体结构如下:


第一个字段table_id为8位,用于标识PSI部分有效载荷数据的类型. 其含义如下:
值说明
program_association_section
conditional_access_section(CA_section)
TS_program_map_section
TS_description_section
ISO_IEC_14496_scene_description_section
ISO_IEC_14496_object_descriptor_section
0x06-0x37
ITU-T建议书保留H.222.0 / ISO / IEC 13818-1
0x38-0x3F
在ISO / IEC 13818-6中定义
0x40-0xFE
私人用户

禁止
在PAT中定义的程序号(program_number)和PMT_PID的映射. 当程序号为0时,将存储network_PID.
有关详细定义,请参阅第2.4.4.3节“程序关联表”.
在传输流中使用
PMT来指示构成传输流中的一组程序的视频,音频和数据的位置,即对应的TS数据包的PID值和程序时钟每个程序位置的参考(PCR)字段.
结构定义如下:

stream_type标识相应pid的类型,例如音频,视频或其他类型(有关具体建议,请参阅“传输流程序映射”部分中的2.4.4.9字段的语义定义).
PES数据包使用固定的24位起始码0x000001和8位流ID来描述当前数据包的类型. PES数据包可以包含时间戳信息,例如DTS / PTS. 总体结构如下:

PES数据包不是固定长度的,音频PES数据包小于或等于64K,视频通常是每帧一个PES数据包. 图像帧的PES数据包通常由许多TS数据包传输. 根据MPEG-2,必须通过整数个TS分组来发送PES分组. 如果最后一个携带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
}
对于最后两个字段的分析,建议参考标准文档中PES数据包中字段的语义定义2.4.3.7.
TS流是我接触到的第一种封装格式,要花很长时间才能完全了解特定的解码过程.
本文没有涉及太多细节. 显然,TS流不包含用于快速查找的机制,并且只能通过协议层来实现查找.
建议使用现有工具(例如TsAnalyse)来分析TS流. 对于广播中常用的TS流,还有更多现成的工具. 新的HLS协议也基于TS流实现.
ISO / IEC_13818-1MPEG-2 TS代码流分析
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-188609-1.html
越往后对我们越有利
臭猴子