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