У меня есть вопрос о 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 сделать это? Большое спасибо!