概述
30帧/秒的视频,如果解码性能足够块(比如RK3399解码可达到61帧/秒),那么ffplay播放时,是如何控制帧率为30帧/秒呢?本文就是为了解开该谜团。
封装
音视频在通过封装器封装时,都必须告诉封装器自己的帧率(采样率/bit rate),然后封装器根据帧率计算每帧的时间戳间隔。比如如下视频帧30帧/秒:
- frame0 pts:00ms
- frame1 pts:33ms
- farme2 pts:66ms
- frame3 pts:99ms
- …
解封装
解封装并未对时间戳做额外处理。
解码
以RockChip设计的MPP硬解码器为例,解码器并未对帧的pts做修改,解码后也只是将原始pts赋值给新解码出来的Frame。
显示
在ffplay中,会有时间同步机制,可参考博文:ffplay 音视频同步的源码分析。该同步机制则实际完成了帧率的播放控制。就算解码再快,显示也得根据pts与当前时间做对比,只有到点了(pts映射实际时间点 <= 当前时间点)才能真正去播放。
因此在概述中讨论的场景,就算解码器解码很快,但受制于显示端。显示端拥堵后,帧缓冲队列满了,则会抑制解码速度。