gpt4 book ai didi

c++ - 如何在 FFMPEG 中填充/计算 motion_val?

转载 作者:太空狗 更新时间:2023-10-29 20:39:16 47 4
gpt4 key购买 nike

我正在尝试通过 ffmpeg(在 C++ 中)获取 mpeg 视频的运动 vector 。我遇到的问题是,AVFrame 类的 motion_val 以及 motion_subsample_log2 和 mb_type 保持为空和/或未初始化(调试器说 0x0)并且似乎它们仅由于兼容性原因才可用我读过 ffmpeg wiki ,您可以通过命令行使用

调试视频的运动 vector
ffmpeg -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

  • libavutil 52. 91.100/52. 91.100
  • libavcodec 55. 68.102/55. 68.102
  • libav 格式 55. 45.100/55. 45.100
  • libavdevice 55. 13.101/55. 13.101
  • libavfilter 4. 10.100/4. 10.100
  • libswscale 2. 6.100/2. 6.100
  • libswresample 0. 19.100/0. 19.100
  • libpostproc 52.3.100/52.3.100

换了更新的版本(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/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com