代码改变世界

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

  jiayayao  阅读(1577)  评论(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输出的流是经过重排序的,也就是说,可以直接送入渲染模块渲染。

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏