Я пытаюсь кодировать видео с помощью libavcodec / libavformat. Звук работает отлично, но когда я пытаюсь кодировать видео, я получаю следующие ошибки:
[libx264 @ 0x10182a000]broken ffmpeg default settings detected
[libx264 @ 0x10182a000]use an encoding preset (vpre)
легко исправить с помощью командной строки ffmpeg, но я пытаюсь сделать это в C. у меня есть варианты
AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);
AVCodecContext *pVideoOutCodecCtx = pVideoOutStream->codec;
pVideoOutCodecCtx->codec_id = CODEC_ID_H264;
pVideoOutCodecCtx->codec_type = CODEC_TYPE_VIDEO;
pVideoOutCodecCtx->bit_rate = pVideoInCodecCtx->bit_rate;
pVideoOutCodecCtx->width = pVideoInCodecCtx->width;
pVideoOutCodecCtx->height = pVideoInCodecCtx->height;
pVideoOutCodecCtx->pix_fmt = pVideoInCodecCtx->pix_fmt;
pVideoOutCodecCtx->sample_rate = pVideoInCodecCtx->sample_rate;
pVideoOutCodecCtx->gop_size = 30;
, но avcodec_open () не работает.
Какие еще значения мне нужно установить, чтобы сделать x264 счастливым?
Я кодирую изображения YUV420P в разные форматы, используя разные кодеки. CodecID я взял из AVOutputFormat после использования функции предположения_формата(...). Но другие настройки кодека (Все они взяты из исходного кода примеров ffmpeg):
c->codec_id = (CodecID)CODEC_ID_H264; //This is your codec id
c->codec_type = CODEC_TYPE_VIDEO;
c->bit_rate = 1000000;
c->width = <...>;
c->height = <...>;
c->time_base.den = 25;
c->time_base.num = 1;
c->gop_size = 12;
c->pix_fmt = PIX_FMT_YUV420P;
if (c->codec_id == CODEC_ID_MPEG1VIDEO) //It not necessary for you
c->mb_decision=2;
// some formats want stream headers to be separate
if(oc->oformat->flags & AVFMT_GLOBALHEADER)
c->flags |= CODEC_FLAG_GLOBAL_HEADER;
Эта настройка должна работать с большинством кодеков, но у меня возникла проблема с fps: не все кодеки поддерживают любые значения fps (и некоторые другие параметры тоже).