扩展ffmpeg extract_mvs.c示例

时间:2015-05-11 18:41:30

标签: c vector ffmpeg computer-vision motion

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

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

请参阅ffmpeg

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

最后一个问题是,对于MP4,运动矢量通常具有四分之一像素分辨率,并且此处给出的分辨率明显四舍五入为最接近的整数。我该如何提取" true"四舍五入前的运动矢量信息?

1 个答案:

答案 0 :(得分:1)

源(未来或过去)基于add_mb()的direction参数给出的相对帧引用,但我不确定该如何构成逻辑:

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

在libavutil / motion_vector.h中有评论,XXX:设置精确的相对参考帧参考而不是+/- 1"方向",所以它看起来像一个未知的TODO补丁的创建者。方向的值来自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显示此运动矢量代码的所有主要部分。希望这能让你朝着正确的方向前进(没有双关语)。