代码改变世界

iOS的VideoToolBox与Android的MediaCodec对PTS的处理异同

2019-12-21 20:42  jiayayao  阅读(1557)  评论(0编辑  收藏  举报

     视频源,不论是从采集设备采集到的,还是本身压制好的文件,其流中的数据都是按照编码顺序存储的。比如1 2 3 4 5,5帧视频数据,1编码成I帧,2 3 4编码成B帧,5编码成P帧。

编码过程:

1. 编码1为I帧;

2. 2,3,4准备编码为B帧,先缓存下来,记录其时间点作为PTS;

3. 再编码5,编码为P帧,5的DTS相对2,3,4靠前,PTS相对于2,3,4靠后;

4. 编码2,3,4,编码为B帧;

存储过程:

存储顺序与编码顺序一致,编码后的顺序为(DTS顺序):1 5 2 3 4

    Android和iOS的硬解码器都不会修改输入PTS,但解码细节略有差别;

1. iOS VideoToolBox

VTB本身不会对解码后的图像进行重排序,所以需要开发者缓存几帧数据,重排序之后再送入渲染模块。具体需缓存的帧个数可以读取视频的extradata,264读取SPS中的num_ref_frames,该字段规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考厂对以及不成对的参考场的最大数量,取值范围在0到MaxDpbSize。265读取VPS中vps_max_num_reorder_pics,该字段表示在CVS中解码顺序在某一帧图像之后,而显示顺序在该图像前的图像最大数量。

2. Android MediaCodec

以同样的数据流输入到MediaCodec,MediaCodec输出的流是经过重排序的,也就是说,可以直接送入渲染模块渲染。