Как изменить настройки AVCodecContext после инициализации (FFMPEG) - PullRequest
0 голосов
/ 16 января 2020

У меня есть вопрос о Libavcode c, на который я не могу найти ответ в Интернете. Я пытаюсь использовать H.264 для кодирования кадров. У меня проблема в том, что кадры, которые я sh должен кодировать, имеют переменную ширину и высоту. Я понимаю, что для кодирования кадров в Libavcode c необходимо передать параметр "width" и "height" в структуру AvCodecContext, а затем инициализировать его следующим образом:

AVCodec *codec = codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *context = avcodec_alloc_context3(encoder->codec);
context->width = 1920;
//OTHER SETTINGS HERE
//FINALLY...
avcodec_open2(context, codec, NULL);

Допустим, после того, как я инициализировал этот контекст, мне нужно кодировать другой кадр, который теперь имеет ширину 900. Я не могу просто сделать context->width = 900, потому что контекст уже установлен на ширину 1920 и инициализирован. Я мог бы создать совершенно новый AvCodecContext и удалить предыдущий с помощью avcodec_close() следующим образом:

AVCodec *codec = codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *context = avcodec_alloc_context3(encoder->codec);
context->width = 900;
//OTHER SETTINGS HERE
//FINALLY...
avcodec_open2(context, codec, NULL);

// DO THE ENCODING HERE

avcodec_close(context);

Но моя программа неожиданно зависала, когда я делал это, и я чувствую, что воссоздаю AVCodecContext каждый раз, когда я Нужно изменить простую настройку ширины / высоты неэффективно для начала. У кого-нибудь есть какие-либо предложения относительно того, как я могу go сделать это? Большое спасибо!

1 Ответ

1 голос
/ 16 января 2020

Это не вещь. Вы должны повторно инициализировать кодировщик или масштабировать / дополнить кадры до того же размера

...