- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试通过 ffmpeg(在 C++ 中)获取 mpeg 视频的运动 vector 。我遇到的问题是,AVFrame 类的 motion_val 以及 motion_subsample_log2 和 mb_type 保持为空和/或未初始化(调试器说 0x0)并且似乎它们仅由于兼容性原因才可用我读过 ffmpeg wiki ,您可以通过命令行使用
调试视频的运动 vectorffmpeg -vismv pf -i input.mp4 output.mp4
结果是 output.mp4 有运动 vector 箭头。于是我在代码中搜索了–vismv参数,在libavcodec\options.c中找到了一长串选项:
{"vismv", "visualize motion vectors (MVs)", OFFSET(debug_mv), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, V|D, "debug_mv"},
我想这行会以某种方式影响 AVCodecContext 的 debug_mv。有了这个假设,我搜索了更多信息,并找到了一些我认为可能有用的代码片段。
pAVCodecContext->debug_mv = FF_DEBUG_VIS_MV_P_FOR | FF_DEBUG_VIS_MV_B_FOR | FF_DEBUG_MB_TYPE | FF_DEBUG_MV;
和
pAVCodecContext->debug |= FF_DEBUG_MV;
但是两者都没有触发motion_val数组的计算或者填充。顺便说一句,我的代码基于 the code by Victor Hsieh and Jiasi Chen这段代码基本上是 ffmpeg 源代码 (libavcodec\mpegvideo.c)。我也试图找到(也在文档的帮助下)触发计算的代码片段,但由于代码的复杂性,我没有得到任何结果。现在的问题是,是否有可能填充此变量或开始计算运动 vector 表,或者是否有任何其他替代方法来获取 mpeg 帧的每个 block 的运动 vector 。
编辑:
我忘了说我的 ffmpeg 版本
Zeranoe 的 FFmpeg 版本:2014-07-08 git-14e2406
换了更新的版本(2.5),但没有改变/解决问题。
最佳答案
运动 vector 在文件 frame.c
中的函数 av_frame_get_side_data()
中可用。
此外,vf_codecview.c
文件定义了绘制运动 vector 的过滤器——请参阅函数 filter_frame()
。
例如,如果你有一个AVFrame
,你可以这样做:
AVFrameSideData *sd = av_frame_get_side_data(frame, AV_FRAME_DATA_MOTION_VECTORS);
从那里开始:
if (sd) {
int i;
const AVMotionVector *mvs = (const AVMotionVector *)sd->data;
for (i = 0; i < sd->size / sizeof(*mvs); i++) {
const AVMotionVector *mv = &mvs[i];
const int direction = mv->source > 0;
// do something with motion vector
}
}
关于c++ - 如何在 FFMPEG 中填充/计算 motion_val?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28364597/
我是一名优秀的程序员,十分优秀!