如果视频解码的速度跟不上音频播放的速度,实际上也可以说是视频解码的速度跟不上 视频播放的速度。
例如 40ms 播放一帧,但是计算机性能比较长,解码一帧就要 45ms。
这种情况,视频播放线程,就会阻塞等待 FrameQueue,具体表现为画面卡住了。
但如果音频是正常播放,那音频就正常播放,但页面卡住。
等到 FrameQueue 有数据了,视频播放线程就会取数据来准备播放,但是播放之前,他会检查这帧数据是不是已经过期了。过期了就直接丢弃。
具体怎么丢弃?就是直接释放内存,不传给 SDL 进行渲染。
丢弃之后再取下一帧,下一帧如果也过期,继续丢弃。
丢弃一帧是非常快的,视频不断丢帧之后,就能追上音频的播放速度了。
不用特意去 seek 操作,就一个一个按顺序去丢弃视频流,这样视频就能慢慢追上音频了。