问题:
omxplayer 的源代码使用 av_seek_frame() 标志调用 ffmpeg AVSEEK_FLAG_BACKWARD 方法。虽然不是 100% 确定,但我相信这会寻求最接近的 i-frame。相反,我想寻找确切的位置,所以我修改了源代码,以便 av_seek_frame() 方法现在使用 AVSEEK_FLAG_ANY 标志。现在,当电影加载时,我会看到一个灰色的屏幕,通常为 1 秒,在此期间我可以听到音频。我已经在多台计算机上尝试过这个(我实际上也在同步它们,因此,也是在同一时间)所以这不是一个孤立的事件。我的猜测是寻求非 i 帧在计算上更昂贵,导致初始灰屏。

问题: 如何使用 ffmpeg 指示音频等待视频准备好后再继续。

最佳答案

实际上, AVSEEK_FLAG_BACKWARD 表示您想要找到时间戳比您正在寻找的时间戳更小的最接近的关键帧。

通过使用 AVSEEK_FLAG_ANY ,您可以获得与您要求的时间戳完全对应的帧。但是这个帧可能不是关键帧,这意味着它不能被完全解码。这解释了您的“灰色屏幕”,它会一直出现,直到到达下一个关键帧。

因此,解决方案是 使用 AVSEEK_FLAG_BACKWARD 向后寻找 并从该关键帧读取下一帧(例如使用 av_read_frame() ),直到找到与时间戳对应的帧。此时,您的帧将被完全解码,并且不再显示为“灰屏”。

注意: 似乎出于某种原因,当我正在寻找的帧是该关键帧之前的帧时,使用 av_seek_frame()AVSEEK_FLAG_BACKWARD 返回下一个关键帧。否则它返回前一个关键帧(这是我想要的)。我的解决方案是更改我给 av_seek_frame() 的时间戳,以确保它会在我正在寻找的帧之前返回关键帧。

关于带有 AVSEEK_FLAG_ANY 的 ffmpeg av_seek_frame 导致灰屏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20734814/

10-11 22:33