扩展ffmpeg extract_mvs.c示例

扩展ffmpeg extract_mvs.c示例,c,vector,ffmpeg,computer-vision,motion,C,Vector,Ffmpeg,Computer Vision,Motion,我使用ffmpeg来提取运动矢量,使用示例docextract\u mvs.c。问题是,这段代码似乎只提供了一些信息:帧编号、宏块大小、源(未来或过去)、源(x和y)和目标(x和y) 不幸的是,这并不是说源来自过去或未来的框架(它可能来自这两个方面、过去的几个方面或未来的几个方面)。它也没有说明宏块类型是什么(这告诉了类似的有用信息)。例如,如果源(x和y)等于目的地(x和y),则无法判断该信息是否与最后一帧相同,或者是否输入了全新的信息 请参见ffmpeg中代码的第60-63行 最后一个问题是

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

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

请参见ffmpeg中代码的第60-63行

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

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

mb->source = direction ? 1 : -1;
在libavutil/motion_vector.h中有一条注释XXX:设置精确的相对参考帧参考,而不是+/-1“方向”,因此它看起来像是补丁创建者未解决的已知TODO。direction的值来自调用add_mb()的位置

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

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

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

如果您想在公开的运动矢量API中获得更多信息,您可能需要修补FFmpeg以提供更多信息,请向上游发送修补程序。现在,无法获取您要查找的信息。@loo yung您能告诉我您是如何使用motionVector source提取运动矢量的吗。我一直在网上搜索一些关于提取运动矢量的参考资料。