2010-11-12 2 views
3

Я следил за учебником here для загрузки видеофайлов в программу на языке C. Но кадры не деинтерлейсируются.Деинтерлейсинг в ffmpeg

Из того, что я видел, исполняемый файл ffmpeg поддерживает переключатель -deinterlace. Как это сделать в коде? О какой библиотеке/функциях я должен прочитать?

ответ

5

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

avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
        packet.data, packet.size); 

if(frameFinished) { 
    avpicture_deinterlace((AVPicture*)pDiFrame, 
          (const AVPicture*)pFrame, 
          pCodecCtx->pix_fmt, 
          width, 
          height); 
    . 
    . 
    . 
} 

Имейте в виду, что вы должны инициализировать pDiFrame аналогично тому, как они инициализировать pFrameRGB в учебнике, создавая свой собственный буфер и вызывая avcodec_alloc_frame и avpicture_fill, только в этот раз формат пикселя будет соответствовать формату декодированного кадра (pCodecCtx->pix_fmt), а не 24-разрядному RGB.

После деинтерлейсинга вы можете выполнить преобразование из кадра с чересстрочной разверткой в ​​RGB, как показано в учебнике.

Смежные вопросы