Как изменить настройки AVCodecContext после инициализации (FFMPEG)

У меня есть вопрос о Libavcodec, на который я не могу найти ответ онлайн. Я пытаюсь использовать H.264 для кодирования кадров. У меня проблема в том, что кадры, которые я хочу кодировать, имеют переменную ширину и высоту. Я понимаю, что для кодирования кадров в Libavcodec вам необходимо передать параметр "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 потому что контекст уже установлен в width 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 каждый раз, когда мне нужно изменить простую настройку ширины / высоты, неэффективно с самого начала. Кто-нибудь есть какие-либо предложения относительно того, как я могу сделать это? Большое спасибо!

Всего 1 ответ


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


Есть идеи?

10000