【问题标题】:Extending the ffmpeg extract_mvs.c example扩展 ffmpeg extract_mvs.c 示例
【发布时间】:2015-07-22 09:40:40
【问题描述】:

我正在使用 ffmpeg 使用示例文档 extract_mvs.c 提取运动矢量。问题是这段代码似乎只提供了一些信息:帧号、宏块的大小、源(未来或过去)、源(x 和 y)和目标(x 和 y)。

不幸的是,这并没有说明来源来自过去或未来的哪个帧(它可能来自两者,来自过去的几个,或未来的几个)。它也没有说明宏块类型是什么(它告诉类似有用的信息)。例如,如果源(x 和 y)等于目标(x 和 y),则无法判断该信息是否与最后一帧相同,或者它是否输入了全新的信息。

参见 ffmpeg 中 extract_mvs.c 代码中的第 60-63 行

最后一个问题是,对于 MP4,运动矢量通常具有四分之一像素分辨率,并且这里给出的分辨率显然是四舍五入到最接近的整数。我应该如何在舍入之前提取“真实”运动矢量信息?

【问题讨论】:

  • 如果您想在公开的运动矢量 API 中获得更多信息,您可能需要修补 FFmpeg 以提供更多信息,请向上游发送补丁。目前,无法获取您要查找的信息。
  • @loo-yung 你能告诉我你是如何使用motionVector源来提取运动矢量的吗?我一直在网上搜索一些提取运动矢量的参考。

标签: c vector ffmpeg computer-vision motion


【解决方案1】:

源(未来或过去)基于 add_mb() 的方向参数给出的相对帧参考,但我不确定该逻辑是什么:

mb->source = direction ? 1 : -1;

在 libavutil/motion_vector.h 中有一条注释,XXX: set exact relative ref frame reference 而不是 +/- 1 “方向”,因此它看起来像是补丁创建者未解决的已知 TODO。 direction 的值来自ff_print_debug_info2(),其中调用了add_mb()。

至于四分之一像素,我认为这也在 ff_print_debug_info2() 中,但我对 motion_val 了解得不够多,无法说出它的含义:

        const int shift = 1 + quarter_sample;
...
                      int mx = (motion_val[direction][xy][0]>>shift) + sx;
                      int my = (motion_val[direction][xy][1]>>shift) + sy;

initial commit 显示了此运动矢量代码的所有主要部分。希望这能让你朝着正确的方向前进(不是双关语)。

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 2016-02-29
    • 2012-10-22
    • 2011-05-10
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多