当前位置: 首页 > 面试题库 >

我如何寻求用ffmpeg框住X号?

苏建安
2023-03-14
问题内容

我正在写一个 视频编辑器 ,我需要在知道 帧号的情况 下寻求精确的

关于stackoverflow的其他帖子告诉我,ffmpeg可能会在搜索后给我造成一些断帧,这对播放不是问题,但对视频编辑器来说是一个大问题。

我需要寻求 通过帧数 按时间,当转换为帧数,这将变得不准确。

我读过Dranger的书(现在已经过时了),最后得到了:

av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);

它总是寻求框架No. 0,并且总是return 0意味着成功。然后,我尝试阅读Blender的源代码,发现它确实很复杂(也许我应该实现图像缓冲区?)。

那么,有没有一种简单的方法可以通过一个简单的调用来查找一个框架seek(context, frame_number)(例如获得一个完整的框架,而不是损坏的框架)?或者,是否有任何简化此功能的轻量级库?

编辑: 感谢 praks411 ,我找到了解决方案:

void AV_seek(AV * av, size_t frame)
{
    int frame_delta = frame - av->frame_id;
    if (frame_delta < 0 || frame_delta > 5)
        av_seek_frame(av->fmt_ctx, av->video_stream_id,
                frame, AVSEEK_FLAG_BACKWARD);
    while (av->frame_id != frame)
        AV_read_frame(av);
}

void AV_read_frame(AV * av)
{
    AVPacket packet;
    int frame_done;

    while (av_read_frame(av->fmt_ctx, &packet) >= 0) {
        if (packet.stream_index == av->video_stream_id) {
            avcodec_decode_video2(av->codec_ctx, av->frame, &frame_done, &packet);
            if (frame_done) {
                ...
                av->frame_id = packet.dts;
                av_free_packet(&packet);
                return;
            }
        }
        av_free_packet(&packet);
    }
}

EDIT2: 事实证明有一个库:FFMS2。daccess-ods.un.org
daccess-ods.un.org它是“基于FFmpeg的源库,可轻松准确地进行帧访问”,并且具有可移植性(至少在Windows和Linux上如此)。


问题答案:

av_seek_frame只会根据时间戳记关键帧。由于它寻求关键帧,因此您可能无法获得所需的内容。因此,建议先找到最接近的关键帧,然后逐帧读取,直到达到所需的帧。

但是,如果要处理固定的FPS值,则可以轻松地将时间戳映射到帧索引

AVStream.time_base如果已指定流,在搜索之前,您需要将时间转换为单位。阅读av_seek_framein的ffmpeg文档avformat.h

例如,如果要寻找1.23剪辑的秒数:

 double m_out_start_time = 1.23;
 int flgs = AVSEEK_FLAG_ANY;
 int seek_ts = (m_out_start_time*(m_in_vid_strm->time_base.den))/(m_in_vid_strm->time_base.num);
 if(av_seek_frame(m_informat, m_in_vid_strm_idx,seek_ts, flgs) < 0)
 {
     PRINT_MSG("Failed to seek Video ")
 }


 类似资料:
  • ffmpeg x 是根据ffmpeg,x264等开源项目,基于ffmpeg框架,扩展而成。 1.音视频编解码库采用ffmpeg框架,现支持h264 wmv gif flv jpeg mpeg等编解码处理。 2.最主要优于原生ffmpeg之处,支持:windows,android,mac/ios,和原生linux等系统;VS,xcode,gcc等IDE开发环境可以直接编译。 目的说明: 由于原ffm

  • 问题内容: 我正在尝试测试登录表单的“记住我”功能。我可以输入用户名和密码,单击复选框,单击提交,或浏览器。但是,当我使用(或任何其他实现)重新打开浏览器时,测试站点不记得任何内容,因为在关闭浏览器时所有cookie都会被删除,而在重新打开浏览器时将无法访问。 问题答案: 对于Chrome(配置): 您必须将路径设置为user-dir,这将在您首次登录后保存所有登录信息。下次再次登录时,将从用户目

  • Project V 提供了多种方式进行交流。 Project V 团队支持中文和英文,请选择你所熟悉的语言来提问,以避免一些不必要的误会。管理员会以问题发起者使用的语言来回复;如果提问者使用了其它的语言,则以英文回复。 Github Issue 我们使用几个不同的仓库进行不同类型的讨论。 代码问题 仅用于讨论 V2Ray 的代码问题,比如 bug。 未来计划 常规讨论 Telegram 讨论组 P

  • 校验者: @片刻 翻译者: @X 项目邮件列表 如果您在使用 scikit 的过程中发现错误或者需要在说明文档中澄清的内容,可以随时通过 Mailing List 进行咨询。 机器学习从业者的 Q&A 社区 <colgroup><col class="field-name"> <col class="field-body"></colgroup> | Quora.com: | Quora有一个和机

  • 8.2 节实现的登录系统自成一体且功能完整,不过大多数网站还会提供一种功能——用户关闭浏览器后仍能记住用户的会话。本节,我们首先实现自动记住用户会话的功能,只有用户明确退出后会话才会失效。8.4.5 节实现另一种常用方式:提供一个“记住我”复选框,让用户选择是否记住会话。这两种方式都很专业,GitHub 和 Bitbucket 等网站使用第一种,Facebook 和 Twitter 等网站使用第二