我使用ffmpeg使用示例doc extract_mvs.c
提取运动矢量。问题是这段代码似乎只提供了一些信息:帧号,宏块大小,源(未来或过去),源(x和y)以及目标(x和y)。
不幸的是,这并不是说来自过去或未来的框架来源(它可能来自过去的几个,也可能来自未来的几个)。它也没有说出宏块类型是什么(它告诉了类似的有用信息)。例如,如果Source(x和y)等于Destination(x和y),则无法判断该信息是否与最后一帧相同,或者是否输入了全新信息。
请参阅ffmpeg
中extract_mvs.c代码中的第60-63行最后一个问题是,对于MP4,运动矢量通常具有四分之一像素分辨率,并且此处给出的分辨率明显四舍五入为最接近的整数。我该如何提取" true"四舍五入前的运动矢量信息?
答案 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显示此运动矢量代码的所有主要部分。希望这能让你朝着正确的方向前进(没有双关语)。