初始化后如何更改AVCodecContext的设置(FFMPEG)

问题描述 投票:0回答:1

我有一个有关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都是没有效率的。有人对我该如何做有什么建议吗?非常感谢!

ffmpeg libav
1个回答
1
投票

这没什么。您必须重新初始化编码器,或将框架缩放/填充为相同大小

© www.soinside.com 2019 - 2024. All rights reserved.