av_seek_frame 每 12 帧寻找一次

av_seek_frame seek only every 12th frames

我在图形应用程序中使用 ffmpeg 视频播放器。

现在我需要实现以特定帧(不仅是第一帧)开始视频的正确方法。我找到了很好的例子 here 并且起初认为它非常适合我:

    bool seek(uint64_t frame)
    {
        int64_t timeBase = (static_cast<int64_t>(_pContext->time_base.num) * AV_TIME_BASE)
                    / static_cast<int64_t>(_pContext->time_base.den);
        auto seekTarget = static_cast<int64_t>(frame) * timeBase;

        if( av_seek_frame(_pFile, -1, seekTarget, AVSEEK_FLAG_ANY) < 0)
            return false;

        avcodec_flush_buffers( _pContext );
        return true;
    }

然而,最近我注意到它只每 12 帧寻找一次:

seek(10); //gives 0 frame
seek(12); //gives 12 frame
seek(20); //gives 12 frame
seek(80); //gives 72 frame

我想我计算 timeBase 不正确,但实际上我找不到如何以正确方式计算的信息。有很多代码示例,但我已经尝试了很多,但根本不起作用。更奇怪的是,我发现了太多不同的方法来计算同一个变量。

P.S。如果有人向我解释timeBase值的含义,或者分享好的解释,那就太好了。

您需要寻找上一个关键帧并进行解码,直到获得您想要的帧。您不能搜索任何帧,因为解码器无法正确解码请求的帧。

你可以找到详细的讨论和代码