【问题标题】:av_seek_frame seek only every 12th framesav_seek_frame 仅每 12 帧搜索一次
【发布时间】:2022-01-30 22:49:14
【问题描述】:

我在图形应用程序中使用 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,但实际上我找不到如何以正确方式进行计算的信息。有很多代码示例,但我已经尝试了很多,但它根本不起作用。甚至奇怪的是,我发现了太多不同的方法来计算同一个变量。

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

【问题讨论】:

  • av_seek_frame 寻找关键帧。
  • 这取决于标志 AVSEEK_FLAG_ANY/AVSEEK_FLAG_FRAME,是吗?
  • 来源是否可搜索?

标签: c++ ffmpeg


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2019-05-28
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多