转自:http://blog.csdn.net/ShinichR/article/details/23101941
关于TS流,这里需要提到几个概念:TS,PES,ES,DTS,PTS
了解PES,TS,ES请移步:http://blog.csdn.net/shinichr/article/details/23098269
TS 流解码过程主要分为以下几个步骤:
1. 获取TS中的PAT
2. 获取TS中的PMT
3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息。
4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等。
5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是 one piece of PES,
在TS header中有一些关于此 payload属于哪个 PES的 第多少个数据包。
6. 拼接好的PES包的包头会有 PTS,DTS信息,去掉PES的header就是 ES。PTS,DTS信息在 pes头部,
当PTS_DTS_flag = ‘10’时,有PTS,当是‘11’时,PTS,DTS都有
7. 直接将ES包送给decoder就可以进行解码。解码出来的数据就是一帧一帧的视频数据,这些数据至少应当与PES中的PTS关联一下,以便进行视音频同步。
8. I,B,P 帧就在ES中,通过picture_header()的picture_start_code来辨别是哪个帧。
PTS,DTS:
DTS(解码时间戳)和PTS(显示时间戳)分别是解码器进行解码和显示帧时相对于SCR(系统参考)的时间戳。SCR可以理解为解码器应该开始从磁盘读取数据时的时间。
有否 PTS/DTS 标志,是解决视音频同步显示、防止解码器输入缓存器上溢或下溢的关键所在。 PTS 表明显示单元出现在系统目标解码器( STD- System Target Decoder )的时间 , DTS 表明将存取单元全部字节从 STD的 ES 解码缓存器移走的时刻。 视频编码图像帧次序为 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9 的 ES ,加入 PTS/DTS后,打包成一个个视频 PES 包。每个 PES 包都有一个包头,用于定义 PES 内的数据内容,提供定时资料。每个 I 、 P、 B 帧的包头都有一个 PTS 和 DTS ,但 PTS 与 DTS 对 B 帧都是一样的,无须标出 B 帧的 DTS 。对 I 帧和 P 帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明 PTS 和 DTS 。
例如,一个解码器输入的图像帧顺序是:I1,P4,B2,B3,P7,B5,B6,I10,B8,B9.解码器输出的帧次序,P4要在B2,B3前,但显示时 P4一定要在B2,B3后。这样重建编码前视频帧次序为 I1,B2,B3,P4,B5,B6,P7,B8,B9,I10。
对于一个ES来说,比如video_sequence ,它有不止一个I,P,B帧,而P,B帧都是以I帧为参考的。B帧是前后向参考的,所以要对B帧decode,就必须先decode该B帧后面的帧(P,或I帧),这样decode时间(DTS)和显示时间就不一样(PTS).
GOP:group of pictrue 即画面组 ,一个GOP就是就是一组IBP帧
PCR:
PCR 是 TS 里面的,即 TS packet 的 adaptation_filed()里面有,当然adaptation_filed()有没有得看adaptation_field_control的值。
PCR用来指定所期望的该 ts packet 到达 decoder 的时间,他的作用于 SCR 类似。