我有一个有关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都是没有效率的。有人对我该如何做有什么建议吗?非常感谢!
这没什么。您必须重新初始化编码器,或将框架缩放/填充为相同大小