ts流详解
来源:互联网 发布:深圳行知职业技术学校 编辑:程序博客网 时间:2024/05/16 07:54
最近认真研究了一下ts流,主要是参考 协议 mpeg2-2(rfc13818),以下做了一些总结。
ts流介绍提纲:
(1)ts流的应用场合
(2)ts流的结构
(3)ts流的解析步骤
(4)ts流如何实现同步
(5)ts流如何实现复用
(6)ts流如何防止解码器的上溢和下溢
(7)ts流如何实现随机读取
(8)ts流如何实现拼接
(9)ts流错误监测
(10)ts流的常用分析工具
(11)试验
(12)参考资料
第一:ts流的应用场合
ts流也叫传输流,ts流是为了 如何将单路或者多路基本音频和视频流以及其他数据组合成适合于存储和(可能会出现显著错误的环境)传输的单路和多路符合流,并提供了使解码器缓冲区能在一个宽范围的补偿或接受条件下同步解码的信息。
上述即对ts 流提出了以下几个要求
1.适合网络传输;即要求了包的长度不能过短,否则包头开销所占比例过大,导致传输传输效率下降,但包的长度也不能过长,否则在丢失同步的情况下恢复同步的周期过长,导致较多的信息丢失
2.适合存储
3.复合,这里的服务包含两层:第一:多路基本的音频和视频符合成一个节目流;第二:多个节目流符合成一个ts流
4.ts流能提供信息给解码器 对 一个节目的 音频和视频同步
5.ts流能提供信息给解码器 调整自身的缓冲区,防止缓冲区上溢和下溢
6.在可能会出现显著错误环境中传输,出现错误时,解码器能快速恢复解码和同步
另外,ts流也提供了 码流的随机获取和码流拼接(常见于节目中中途插入广告)、码流加密(常见于付费节目,需要解扰)
第二:ts流的结构
这一段说明的内容主要有:
(1)常用ts流中常用符号
(2)ts流的基本结构
(3)ts流的包头
(4)适应区
(5)pes
(6)PSI
1.常用符号和缩写
(1)ts :传输流,一个传输流包含一个或多个节目
(2)ps:节目流,一个节目流只包含一个节目
(3)节目:一个节目包含一个或多个pes流
(4)es:基本流,也就是一个视频流或者一个音频流
(5)ts分组:一个ts分组,固定长度为188个字节,一个ts分组的固定格式如:
ts分组=ts头+(适应字段)+(充填信息)/(负载)
负载=psi/pes头+es/es
其中”()“表示是可选字段,”/“表示 其中几种情况的 其中一种
是否存在负载由 ts头 的 adaption_field_control 决定
负载的具体情况 由ts头的pid和payload_unit_start_indicator字段决定
是否存在适应字段由 ts头 的 adaption_field_control 决定
(6)pes流:pes流包含一些pes分组。这些分组的的有效负载包含来自单个基本流(es)的数据,而且分组具有相同的流标识。一般情况,一个pes分组 的负载仅包含一帧数据(音频或者视频),一份pes分组的长度远远大于ts分组(188个字节),所以一个pes分组需要分片负载到ts流中
(7)psi:节目特定表,一般有四种表 pat(节目相关表),pmt(节目映射表),nit(网络信息表),cat(条件存取表)
2.ts流的结构描述
一个ts流,又一个个ts分组组成,一个ts分组188 个字节,由固定其实码0x47开头 ;ts分组由ts头+(适用字段)+(充填信息)/(psi/pes头+es/es)组成
如上图所示,刚开始接受码流时,通过判断连续3个相隔188的字节,如果都符合0x47(sync_byte)可以认为这些是ts分组
如上图所以,是一个ts流分组的具体情况
一个ts分组分成三部分:
第一部分:ts 头:sync_byte 到 continuity_counter 是ts 头,包含4个字节的内容,主要负责ts包的同步,各种类型负载的表示,ts 包传输差错的检测和条件接受等功能
第二部分:适用区,adaption_fields(),当字段 adaption_field_control 取10 或11 时 才有
第三部分:有效负载,data_byte,当字段 adaption_field_control 取01 或11 时 才有
ts 分组头中各个字段的语义定义:
同步字节字段,sync_byte
一个固定值维0x47 的8 位字段。用于建立发送端和接收端的包同步
包差错指示字段:transport_error_indicator
用于从解码器向分解器指示传输误码,设置为1时,表示该ts包中负载信息有错误,无法使用。
净负载单元起始指示:payload_unit_start_indicator
设置为1 时,表示PES包头以及包含节目特定信息的表(pmt,pat)的头是否出现在该包中,在失去同步后重新同步起重要的作用
传送优先级字段:transport_priority
用于表示包中含有重要数据,应该优先传送
包标识符:PID
用来标识ts包所承载的数据。ts码流生成时,每一类业务(视频,音频,数据)的基本码流都被赋予一个不同的标识号PID,解复用时,就是通过pid 来区别 该pes分组数据是属于哪一个分组的
加扰控制字段:transport_scrambling_control
传送的信息通过加入扰码来加密,各个基本码流可以独立进行加扰,加扰控制字段说明ts包中负载数据是否加扰。如果加扰,标志处解扰的秘钥
适应字段控制字段 adaption_field_control
循环技术器:continutity_conunter
用于对传输误码进行检测。在发送端对所有的包进行0-15的循环技术,在接受端,如发现循环技术器的值终端,表名数据在传输中有丢失
适用区字段:
适用区字段的功能:
1.编解码中音频和视频同步
2.随机进入压缩的码流(经过编码的视频,音频流具有规定的格式,尤其是视频码流中,存在着 I P B种编码帧类型,其中只有I帧数据可以独立进行解码)
3.当地节目插入(节目拼接。在电视广播中,常需要进行本地节目和广告的插入,ts包适应区中的一些标志支持上述功能,在进行本地节目插入时,插入节目的PCR值与插入前节目的PCR值是不同的,因此需要有标识信息通知解码器PCR值将发生改变,以便使解码器能及时改变时钟频率和相位,并与插入节目尽快建立同步关系)
与同步和定时相关的字段有:
- discontinutity_indicator:当负载数据是pcr_pid 时,表示 时钟不连续,需要重新同步。当pid为视频或者音频数据时,表示continuity_counter不连续
- pcr_flag:2位标示符,表示是否具有解码参考时钟
3.opcr_flag:原始的pcr信息,格式和pcr_flag相同
与随机进入压缩码流有关的字段:
1.random_access_indicator: 设置为1时,表示该ts分组的负载带有pes分组的头信息,如果是视频的话,为I帧,标识着从这个包开始切入可以正常解码出数据,不依赖前面的数据
与拼接相关的字段:
splicing_pointer_flag:此字段设置为1,时,适用区带有拼接的附加信息,含有拼接相关的信息,标识还有多少个包就到拼接点
adaptation_field_extension_flag:附加信息标志
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 包头 几个重要字段 解析:
分组起始码:
24位 代码,它和后面的stream_id构成了表示分组开始码:0x000001
流标识字段 stream_id:
在节目流(ps)中,他规定了基本流的号码和类型,详情看表2-18(参考rfc13818);在传输流(ts),基本流类型在2.4.4 (参考rfc13818)的节目特定信息中做了规定
选项区域:optionals fields
中 可以包含 基本流同步信息 pts和dts,码流速率es rate,也可以包含码流控制信息dsm
psi 节目特 定信息表:
psi 节目特定表的作用对于ts流有两个:
第一:用于节目流的复合,用于基本流的复合
第二:用于基本流加扰时,用于提供解密信息
在传输流中,PSI被分成4个表结构,虽然这些结构可以被看做简单的表,但他们应被进一步划分为各个段并插入到传输分组中,一些带有预先规定的PID,另一些带有用户可选的PID;
PSI表应被划分为携带与传输分组中的一个或多个段。一个段就是一个用于把每个PSI表映射到传输流分组中的语法结构
各个段的长度不是固定的。每一段的开始由传输分组的有效负载中的pointer_field来标识。携带PSI段的传输分组中还可能有适应字段。
节目相关表:每一个传输流都包含一个或多个PID值为0x0000的传输分组。这些传输分组一起将包含一个完整的节目关联表,以给出该传输流中所有节目的一个完整列表;定时插入,方便ts流可以用于实时流播放
条件存取表:一旦传输分组中一个或多个基本流被加扰,就要传送一个PID值为0x0001的而且包含一个完整的条件存取表的传输流分组。表中包含于加扰流相关联的CA_descriptor.传输的传输流分组共同组成一个条件存取表的完整版本
节目映射表:table_id值为0x02 的段应包含节目映射表信息。这些段可能携带与有不同pid值得传输流分组中。
网络信息表:网络信息表示可选,器内容也是专用的。如果存在的话,它将携带与一些传输分组中。这些传输流分组有相同的PID值,称为network_PID,值由用户定义,若存在网络信息表,它将以一个或多个private_section的形式出现;
节目相关表:
节目相关表给出了携带节目定义的传输流分组中program_number与该分组的PID值得对应关系。也就是说从这个表中可以获取到该ts流中由多少个节目组成。program_number是与一个节目相关联的数值符号。
上述字段详解:
表标识字段 table_id
8位字段,对已节目相关表,固定为0x00
版本号字段 version_number和 当前下一个知识符字段current_next_indicator:
因为ts流可以实时发生变化,这里的变化是指ts流中新增或者减少一个节目流,或者一个节目中的新增或者减少一个基本流。所以一旦ts流节目信息发生了变化。version_number 它是整个节目相关表的版本号码,一旦节目相关表发生变化,该字段将递增1.在current_next_indicator 为1 时,标识该版本号应该是当前使用的节目相关表的版本号;在current_next_indicator 为0 时,版本号应该是下一个使用的节目相关表版本号,标识当前传送的节目相关表还不适用
节目映射表:
节目映射表给出了节目号码和组成它们的节目元素之间的映射。该映射的一个单一实例被称为 节目定义。节目映射表示一个传输流中所有节目定义的完整集合。该表在分组中被传输,分组的PID值由编码器选择,需要时可能用到多个PID,该表包含在具有以下语法的一个或多个段中。
从节目映射表中,可以得到的信息有:
第一:这个节目各个es流的同步时钟,由PCR_PID值 所有在ts流分组中获取到
第二:这个节目由哪几个es流组成
第三:这个节目组成成分是否发生了改变,由version_number和current_next_indictor中得知
节目表重要字段解析:
PCR_PID:该字段的值标识 该节目的pcr 信息携带在 ts流分组 PID值等于PCR_PID中。该PCR值是该节目各个基本流的同步时钟。
stream_type:8位字段,它指出了携带在分组中的节目元素的类型,这些分组的PID由elementary_pid所指出
PAT表与PMT 表,包含ES的ts分组关系如下:
第三: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流是如何实现同步的
ts流中复合了多个节目,这里说的同步是指 ts流中 一个节目中 多个es(音频,视频,或其他数据)的同步
音视频同步由DTS,PTS和pcr 三者协调完成,并且PCR是重建系统时间基准的决定时标,而DTS和PTS是解码和重现时刻的相对时标。
对于一个es来说,比如视频,它有许多 I,P,B帧,因为 B帧是双线预测帧 需要 I,P帧信息才能解码,ts分组发送过来的 帧 顺序 可能是 I1 P3 B2 ,但显示顺序是 I1 B2 P3,所以解码时按照各个帧的 dts 进行decode,然后再按照PTS 对各个帧进行展现
DTS和pts 信息从pes 头中获取,pcr携带于 PCR_PID 的ts分组 中的 适应区中
第五:ts流是如何实现复用的
一个ts流由多个 节目组成,一个节目由多个 基本流组成
各个基本流的信息 携带于PMT表中,组成一个节目映射表信息
各个节目的信息 组合在PAT表中,PAT 表定时在ts流分组中携带。
解复用也就是 上述的逆过程,首先获取PAT,然后获取到单个节目的PMT,然后获取到es的pid,最后把目标pid 的ts分组 的内容 获取下来进行拼接,就是单个es流
第六:ts流如何防止解码器的上溢和下溢
防止解码器的上溢和下溢,解码器模型需要参照STD模型进行设计
上图中 的信息主要有几点:
(1)缓冲区:ts流缓冲区,ts复合流缓冲区,单个es缓冲,解码缓冲区,展示缓冲区,系统信息缓冲区
(2)缓冲区大小的设计和规定
(3)各个缓冲区数据 进入的速率和移出的速率
(4)各个缓冲区数据 进入和移出的时间点
传输速率与pcr 时间有关
缓冲区的大小 有点是固定的,有的是根据视频类型来决定
第七:ts流如何实现随机读取
实现随机读取的目的和应用场合是解码端可以在短周期内获取到解码信息和同步信息。
在考虑随机存取的系统中,推荐对PSI段重复传输数次,即使结构没有发生改变。因为在通常情况下,解码器需要PSI数据来识别传输流的内容,已能够开始解码。标准对PSI段的重复和出现率没有要求。但是,显然重复传输对随机存取应用是有帮助的,虽然导致了PSI数据所有用比特率数据量的增加。
在适应区有字段标识 此段数据可以单独开始使用(特别是针对视频数据,一般是I帧数据,random_access_indicator 设置为1),
第八:ts流如何实现拼接
与拼接相关的字段 是 适应区 中 splicing_point_flag;拼接后的PCR 会发生改变,也会通过适应区的字段来通知解码器;
具体怎样拼接es流,没有研究过。
第九:ts流错误检测
根据对MPEG-2和DVB标准的盐焗,错误只是分为3个等级;第一等级是正确解码所需要的几个参数;第二等级是大道同步后连续工作需要的参数和需要周期监测的参数;第三等级是依赖于应用的几个参数,差错优先级分类如下:
第一优先级:导致无法解码的差错(共6个),传输流同步丢失(TS sync loss);同步字节错误(sync byte error);节目相关表错误(PAT error); 节目 映射表错误(PMT error);连续技术错误(continutity count error);PID 错误
第二优先级:对解码损伤差错(共6个),传送包错误(transport error);节目时钟参考错误(pcr error);节目时钟参考精度错误(PCR accuracy error);循环冗余检测错误(CRC error);PTS 错误;条件接收表错误
第三优先级:不影响可解码差错(共10个):NIT 错误;si重复错误;缓冲器错误;sdt错误;eit 错误;rst 错误;tdt错误;空闲缓冲器错误;数据延迟错误
第十:ts流的常用分析工具
(1) transport stream analyser
(2)elecard streameye tools
(3)抓包工具,wireshark
第十一:试验
(1)h264 裸流文件转成 ts流文件
ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts
(2) 通过udp协议 直接发送ts流到某端口
发送命令:ffmpeg -re -i test.ts -vcodec copy -f mpegts udp://192.168.1.108:6666
播放命令: ffplay -f mpegts udp://192.168.1.108:6666
(3) ts流负载到rtp 包中发送到某端口
发送命令:ffmpeg -re -i test.ts -vcodec copy -f rtp_mpegts rtp://192.168.1.108:6666
使用wireshark抓本机的包可以看到 ts流
参考资料
rfc13818
http://blog.csdn.net/yansen_2010/article/details/40113509
http://blog.csdn.net/liuhongxiangm/article/details/8981032
http://www.cnblogs.com/tocy/p/media_container_6-mpegts.html
0 0
- ts流详解
- ts流格式详解
- TS流PAT/PMT详解
- TS流PAT/PMT详解
- TS流PAT/PMT详解
- TS 详解
- TS 详解
- TS 详解
- TS详解
- TS详解
- TS 详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- hls之m3u8、ts流格式详解
- 输出文件的最后几行,可以对付超大文件
- YTKNetwork 使用基础教程
- kail linux配置静态网络方法
- Java_web项目,URL请求地址中项目名设置为自定义变量
- leetcode题解-138. Copy List with Random Pointer
- ts流详解
- java:jdbc连接数据插入中文数据乱码解决办法:
- 数据结构---图的详细介绍
- gazebo打不开world的解决方法
- PHPStorm下XDebug配置
- leetcode520 Detect Captical Java
- 2016年度总结-
- 每周一读-《超级富翁的9个习惯-古巴比伦的理财圣经》
- 复制内容到剪切板