c++ - av_seek_frame 仅每 12 帧搜索一次

标签 c++ ffmpeg

我在我的图形应用程序中使用 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 值的含义,或者分享好的解释,那就太好了。

最佳答案

您需要寻找前一个关键帧并解码,直到获得所需的帧。您无法搜索任何帧,因为解码器无法正确解码请求的帧。
你可以找到详细的讨论和代码here

关于c++ - av_seek_frame 仅每 12 帧搜索一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70892584/

相关文章:

c++ - '(' 出现奇怪的 C++ 语法错误

c++ - 包含 Guards 和#ifndef#define 预处理语句

ffmpeg - 使用 FFMPEG 解析 NAL 单元

php - 异步运行 PHP exec(),但检查是否完成?

android - FFmpeg 只显示输入文本中的数字(没有字符,只有数字)错误=13,权限被拒绝

ffmpeg - 使用 ffmpeg 覆盖图像无限期地运行脚本

c++ - 类型衰减 STL 迭代器

java - Socket Java 到 C++ - 消息的长度始终为 8192 个字符

c++ - 将输入流从 PortAudio 馈送到 webrtc::AudioProcessing

php - FFMPEG 和 PHP 在 Mac 上不起作用