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

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


person M. Ying    schedule 16.01.2020    source источник


Ответы (1)


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

person szatmary    schedule 16.01.2020
comment
Спасибо! Правильно ли я повторно инициализирую кодировщик выше? В качестве альтернативы, как я могу заполнить фреймы? - person M. Ying; 16.01.2020
comment
Создайте график фильтра. - person szatmary; 16.01.2020