全新系列文章已更新:
- Android Media Framework - 开篇
- Android Media Framework(一)OpenMAX 框架简介
- Android Media Framework(二)OpenMAX 类型阅读与分析
- Android Media Framework(三)OpenMAX API阅读与分析
- Android Media Framework(四)Non-Tunneled组件的状态转换与buffer分配过程分析
- Android Media Framework(五)Tunnel Mode
- Android Media Framework(六)插件式编程与OMXStore
- Android Media Framework(七)MediaCodecService
- Android Media Framework(八)OMXNodeInstance - Ⅰ
- Android Media Framework(九)OMXNodeInstance - Ⅱ
- Android Media Framework(十)OMXNodeInstance - Ⅲ
- Android Media Framework(十一)OMXNodeInstance - Ⅳ
- Android Media Framework(十二)OMXNodeInstance - Ⅴ
- Android Media Framework(十三)ACodec - Ⅰ
- Android Media Framework(十四)ACodec - Ⅱ
- Android Media Framework(十五)ACodec - Ⅲ
- Android Media Framework(十六)ACodec - Ⅳ
有一些音视频初学者想要了解TS码流结构,但网上资料不全或者讲得不够清楚,使得学习过程变得异常艰难。这一篇内容将对TS码流结构做详尽解析,争取做到通俗易懂,成为最好的TS码流解析文章。
本篇TS码流解析将会参照Android的ATSParser代码。
首先我们要知道一个标准的TS包一般有188字节,但是也有TS包是192字节或者204字节的情况。同一路TS流中,每个TS包大小是一致的,不会同时出现188字节和192字节的TS包。接下来的文章中,我们只解析标准188字节的TS包。
标准TS包包括一个4
字节的包头、n
字节自适应域(可选)和184-n
字节的负载(可选),可选的意思是它可能在TS包中存在,也可能不存在。TS包的结构如图:
图中橙色部分是包头(header),蓝色部分是自适应域(adaptation field),黄色部分是负载(payload)。
1、TS Header解析
4字节包头共包含有8个字段,接下来依次解析包头字段:
sync_byte
:同步字节,值为0x47
,关于同步字节有以下几点需要了解:- 同步字节表示一个新的TS包的开始,从同步字节开始往后的188字节为一个完整的TS包;
- 根据以上特点,可以通过检查一个流的188个字节的整数倍位置是否为0x47来判断流是否为TS流;
- 如果一段码流中间丢了一部分数据(丢失同步),可以利用同步字节重新找回同步,但是要注意,码流本身可能包含0x47的数据,所以当找到一个0x47时,需要向前和向后各跳跃188个字节,如果这些位置仍然时0x47,那么就可以确定这个0x47是同步字节,TS流已经对齐成功。
transport_error_indicator
:传输误差标志,该数据包在传输过程中是否出现错误,如果该位为1,说明应该立即丢弃该TS包;payload_unit_start_indicator
:有效负载单元起始标志,
2、Adaptation Field解析
继续往后解析,需要先看自适应字段控制的值,值为10
和11
时TS Header后会跟有一个(自适应域)adaptation field,接下来对这个部分做解析:
adaptation field的结构如图:
结构图中的橙色部分是必选(肯定存在)的控制字段,绿色部分是可选,绿色部分的内容由控制字段的值所决定。接下来先看控制字段有哪些:
adaptation Field Length
:自适应域的长度,不包含这个字段本身;discontinuity indicator
:非连续指示符,标记当前TS包的数据流在此处是否有间断,我们要注意的是discontinuity indicator和continuity counter是两个不同的概念,前者关注的是数据的连续性,后者关注的是TS包本身的连续性;
扫描下方二维码,关注公众号《青山渺渺》阅读音视频开发内容。