我使用ffmpeg来使用示例doc extract_mvs.c提取运动矢量。问题是,这段代码似乎只提供了一些信息:帧号、宏块大小、源(未来或过去)、源(x和y)和目标(x和y)。
不幸的是,这并没有说明源源来自哪个框架(它可以来自于过去或将来的两个部分)。它也没有说明宏块类型是什么(这也说明了同样有用的信息)。例如,如果Source (x和y)等于目标(x和y),则无法判断该信息是否与最后一个帧相同,或者是否输入了全新的信息。
请参阅ffmpeg中mvs.c代码中的第60-63行。
最后一个问题是,对于MP4,运动矢量通常有四分之一像素的分辨率,这里给出的分辨率显然是四舍五入到最接近的整数。在舍入前,我应该如何提取“真实”的运动矢量信息?
发布于 2015-05-21 02:44:15
源(将来或过去)是基于add_mb()的方向参数给出的相对帧引用,但我不知道如何处理逻辑:
mb->source = direction ? 1 : -1;在libavutil/motion_vector.h中有一个注释XXX:设置确切的相对参考帧引用,而不是一个+/- 1的“方向”,所以它看起来就像补丁的创建者没有解决的已知TODO。方向的值来自调用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;初始提交显示了这个运动矢量代码的所有主要部分。希望这能让你朝着正确的方向前进(没有双关的意思)。
https://stackoverflow.com/questions/30175222
复制相似问题