Извлечение информации о макроблоке в FFmpeg

#ffmpeg #h.264 #libavcodec #libav #h.265

#ffmpeg #глава 264 #libavcodec #libav #глава265

Вопрос:

У меня есть файл .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);
    }
  

Я видел в другом сообщении, в котором упоминалось, что мы можем получить информацию MB через структуру MpegEncContext, но я в замешательстве, и как создать экземпляр объекта этой структуры, как данные MB структуры обновляются для каждого кадра.?

В конечном счете, я хочу сравнить макроблок из одного кадра с другим кадром, используя SAD (сумма абсолютной разницы) и вызывать оповещения, если есть какие-либо искажения на уровне макроблока.

Я был бы очень признателен, если кто-нибудь поможет в этом.

Ответ №1:

Вы можете получить информацию о MB (MV и другую) из структуры AVFrame. В AVFrame есть элемент int16_t (*motion_val[2])[2], из которого вы можете получить MV.