c - 扩展 ffmpeg extract_mvs.c 示例

标签 c vector ffmpeg computer-vision motion

我使用 ffmpeg 通过示例文档 extract_mvs.c 提取运动 vector 。问题是这段代码似乎只提供了一些信息:帧编号、宏 block 大小、源( future 或过去)、源(x 和 y)和目标(x 和 y)。

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

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

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

最佳答案

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

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

在 libavutil/motion_vector.h 中有一条评论,XXX:设置精确的相对引用帧引用而不是 +/- 1“方向”,所以它看起来像是补丁创建者 Unresolved 已知 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显示了这个运动 vector 代码的所有主要部分。希望这能让您朝着正确的方向前进(没有双关语意)。

关于c - 扩展 ffmpeg extract_mvs.c 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30175222/

相关文章:

c - 这两个宏有什么区别吗?

javascript - 如何计算多个航点之间的航点?

video - ffmpeg 在 sws_scale() 中从 YUV 到 RGB 的效果较差(为 : ffmpeg blocky chroma decoding)

c - 在 c 中获取最大变量大小为 32 位的时间戳(以微秒为单位)

c - 遍历硬盘并确定给定 block 当前是否正在使用的最有效方法是什么?

c - 是否可以在不存储节点索引的情况下为图构造邻接矩阵

C++ 从函数定义在 main 中的类中的函数指针 vector 调用函数

c++ - 如何在类中初始化 vector ?

ffmpeg - 使用 ffmpeg/ffserver 流式传输 webm

ffmpeg - 转码 ts 后的持续时间变化