首页 > 解决方案 > 在 FFmpeg 中获取宏块信息

问题描述

我有一个 .mp4 文件,其中包含 h.264 视频和 AAC 音频。我想在解码时提取每帧的宏块和运动矢量信息。请在下面找到我的伪代码。

avformat_open_input(file_name) //opening file 
avcodec_open2(pCodecContext, pCodec, NULL) // opening decoder
while (response >= 0) // reading each frame
    {
        response = avcodec_receive_frame(pCodecContext, pFrame);
        if (response == AVERROR(EAGAIN) || response == AVERROR_EOF || response < 0) {
            break;
        }
        // extract macroblock of pFrame here
        av_frame_unref(pFrame);
    }

我在其他帖子中看到提到我们可以通过 MpegEncContext 结构获取 MB 信息,但我很困惑,以及如何实例化该结构的对象,结构的 MB 数据如何为每一帧更新。?

最终,我想使用 SAD(绝对差之和)比较一帧与另一帧的宏块,并在宏块级别有任何失真时触发警报。

如果有人对此提供帮助,我将不胜感激。

标签: ffmpegh.264libavcodeclibavh.265

解决方案


您可以从 AVFrame 结构中获取 MB 信息(MV 和其他)。在 AVFrame 中有一个成员 int16_t (*motion_val[2])[2] 可以获取 MV。


推荐阅读