Кодирование видео MPEG-2 с помощью ffmpeg API: больший размер файла, чем ffmpeg.exe - PullRequest
1 голос
/ 26 мая 2011

Я пытаюсь кодировать видео из необработанного YUV в MPEG-2 с помощью API ffmpeg.

Моя проблема в том, что генерируемый API файл составляет ок.В 1,7 раза больше, чем эквивалентные файлы, сгенерированные самой ffmpeg .

Я использую параметр квантования (через qmin и qmax) вместо битрейта.

Версия API в основном:

//...
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
pCodecCtx->qmin = 3;
pCodecCtx->qmax = 3;
pCodecCtx->time_base.num = 1;
pCodecCtx->time_base.den = 30;
avcodec_open(pCodecCtx, avcodec_find_encoder(CODEC_ID_MPEG2VIDEO));
//...
while(/*...*/) {
  avcodec_encode_video(pCodecCtx, pOutbuf, outbufSize, pPicture);
  //..
}
//...

Для самого ffmpeg я использую команду:

ffmpeg -s 352x288 -r 30 -i foreman_352x288.yuv -f mpeg2video -vcodec mpeg2video -r 30 -pix_fmt yuv420p -qmin 3 -qmax 3 foreman.m2v

Почему файл, генерируемый API , достигает скорости 5212 кбит / с, а файл, сгенерированный ffmpeg для того же qp, составляет 3047 кбит / с ??

(Еще более удивительным является то, что меньшая версия ffmpeg имеет чуть более высокое значение PSNR, 40,49 дБ против 40,02 дБ).

Есть ли какие-либо другие важные параметры, которые я пропустил? ffmpeg действительно учитывает параметр квантования?

1 Ответ

1 голос
/ 25 июля 2011

При использовании API ffmpeg тип изображения (I-кадр, P-кадр и т. Д.) Необходимо устанавливать вручную для каждого кадра. По умолчанию ffmpeg сделает каждый кадр I-кадром.

Решение состоит в том, чтобы установить тип изображения перед кодированием кадра (здесь для размера GOP 12):

//...
while(/*...*/) {
  if(pCodecCtx->frame_number % 12) 
    pPicture->pict_type = AV_PICTURE_TYPE_P;

  avcodec_encode_video(pCodecCtx, pOutbuf, outbufSize, pPicture);
  //...
}
//...

Обратите внимание, что настройка pCodecCtx->gop_size перед кодированием не помогает.

...