带有 AVSEEK_FLAG_ANY 的 ffmpeg av_seek_frame 会导致灰屏

标签 ffmpeg media-player seek

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

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

最佳答案

实际上,AVSEEK_FLAG_BACKWARD表示您想要查找最近的关键帧,其时间戳比您要查找的关键帧更小

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

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

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

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

相关文章:

android - 在Android上使用MediaPlayer的音量问题

android - E/MediaPlayer : start called in state 64, mPlayer(0x9a024be0)

audio - 如何在不将所有文件加载到内存的情况下查找ogg vorbis文件?

c# - 使用 FileStream.Seek

video - libav/FFMPEG 以一种编码流式传输,另存为另一种编码

c++ - 获取合成时间 C++

audio - 对MP3文件字节数组的html5访问

python - youtubedl 在 python 音乐机器人中停留在 'downloading webpage'

Ffmpeg 2 单输出中的输入摄像机

linux - 关于文件查找位置的问题