gpt4 book ai didi

C++ FFmpeg 从系统中选择编解码器

转载 作者:行者123 更新时间:2023-11-30 03:47:49 29 4
gpt4 key购买 nike

我目前正在设置我的输出上下文以创建 .avi,如下所示:

avformat_alloc_output_context2(&outContext, NULL, NULL, "out.avi");
if (!outContext)
die("Could not allocate output context");

但是,生成的视频质量非常不佳。因此,我希望能够获取系统上已安装的编解码器并在 avformat_alloc_output_context2 中使用其中之一。类似于以下内容:

Video codec picker

所以我想我的两个问题是:

  1. 如何创建包含已安装编解码器的列表(数组)(如上所述)?
  2. 如何在输出容器中使用其中之一?

如果可能,我还希望能够修改输出质量 (0%-100%) 并打开编解码器配置窗口。

最佳答案

首先,使用带有 AVCodecID 的字符串(或其他)制作 map ,如下所示:

 std::map<string, AVCodecID> _codecList;
_codecList["h264"] = AV_CODEC_ID_H264;
_codecList["mpeg4"] = AV_CODEC_ID_MPEG4;
....

请注意,FFmpeg 不提供信息,说明哪个编解码器在哪个容器中可用,因此您应该自行验证。但您可以引用以下链接(至少它是官方的):https://en.wikipedia.org/wiki/Comparison_of_video_container_formats

接下来要做的是按名称或以下代码中的 AVCodecID 查找编码器:

avcodec_find_encoder_by_name("libx264");
avcodec_find_encoder(AV_CODEC_ID_H264);

两者都返回 AVCodec* 所以你可以在调用 avformat_new_stream() 时使用它,像这样:

AVCodecID codec_id = (_codecList.find("h264") != _codecList.end()) ? 
_codecList.find("h264") : AV_CODEC_ID_NONE;
if(codec_id == AV_CODEC_ID_NONE)
{
return -1;
}

AVCodec* encoder = avcodec_find_encoder(codec_id);
// or you can just get it from avcodec_find_encoder_by_name("libx264");

AVStream* newStream = avformat_new_stream(avFormatContext, encoder);

决定视频质量的因素有很多。 x264,尤其是有更多的选择。在这种情况下,您可以通过 crf 值或比特率来列出它(您不能同时使用这两个选项)。您可以使用 AVCodecContext 确定它。

AVCodecContex* codec_ctx = newStream->codec;
codec_ctx->bitrate = 1000000 // 1MB
// codec_ctx->qmin = 18;
// codec_ctx->qmin = 31;

完成后,使用 avcodec_open2 打开它

 avcodec_open2(avFormatContext, encoder, NULL);

释放它时不要忘记关闭。

 avcodec_close(avFormatContext);

创建自己的输出流时有很多事情要做。如果您对此有更深入的体验,我认为这个答案就足够了。

但是如果你没有太多的 FFmpeg 经验,你可以在这里找到我的完整示例(https://github.com/sorrowhill/FFmpegTutorial)

关于C++ FFmpeg 从系统中选择编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505545/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com