gpt4 book ai didi

ffmpeg - 替换 libav 中已弃用的 AVStream 编解码器参数

转载 作者:行者123 更新时间:2023-12-04 22:56:43 26 4
gpt4 key购买 nike

很久以前,我实现了一个 C++ 类来从一组图像创建 MP4 视频文件。该代码运行良好,但是,我发现了一个我想摆脱的弃用警告。来自 的参数“ 编解码器 ”视频流 结构已被弃用,我想替换它。
这是我当前的工作代码:

AVOutputFormat *outputFormat = av_guess_format("ffh264", movieFile.toLocal8Bit().data(), nullptr);
if (!outputFormat)
return false;

enum AVCodecID videoCodecID = outputFormat->video_codec;

AVCodec *videoCodec = avcodec_find_encoder(videoCodecID);
if (!videoCodec)
return false;

AVStream *stream = avformat_new_stream(formatContext, videoCodec);
if (!stream)
return false;

AVCodecContext *videoCodecContext = stream->codec; // <- codec is a deprecated parameter

videoCodecContext->width = videoW;
videoCodecContext->height = videoH;
现在,要替换“ 编解码器 ”参数,libav 开发团队建议使用包含在 AVStream 结构中的参数“ 编解码器 ”( AVCodecParameters )。他们用来分享的例子是这样的:
if (avcodec_parameters_to_context(videoCodecContext, stream->codecpar) < 0)
return nullptr;
注: 编解码器 ( AVCodecParameters ) 本身就是一个数据结构。
不幸的是,当我尝试使用该代码时,我遇到了这个问题:通常,所有信息都存储在 中。编解码器 参数来自先前打开的先前视频文件的数据结构。换句话说,信息已经存在。在我的情况下,情况有所不同,因为我从头开始创建 MP4 文件,所以没有以前的 编解码器 要使用的记录,因此我必须自己创建一个新的 AVCodecParameters 结构实例,手动设置每个变量。
到目前为止,我可以设置 中的所有变量。编解码器 结构,除了两个:
uint8_t * extradata 
int extradata_size
注意:目前我可以在不设置这些变量的情况下“成功”创建 MP4 文件,但文件不完整,当我尝试使用“mplayer”播放它时,我收到以下错误消息:
[extract_extradata @ 0x55b5bb7e45c0] No start code is found.
我正在研究这两个领域,似乎它们存储了一些与编解码器相关的信息,在我的例子中是 H264。
所以,我的具体问题是:如果我设置 编解码器 变量( AVCodecParameters )从头开始,如何设置字段的值 额外数据 额外数据大小 以正确的方式用于编解码器 H264?

最佳答案

解决方案:
这是我用来替换已弃用的 的基本步骤列表。流->编解码器数据结构成功:

  • 初始化 AVFormatContext、AVOutputFormat 变量(使用 av_guess_format 和 avformat_alloc_output_context2)
  • 打开视频编解码器(使用 avcodec_find_encoder)
  • 添加/初始化 AVStream 变量(使用 avformat_new_stream)
  • 初始化 AVCodecContext 变量(使用 avcodec_alloc_context3)
  • 仅在需要时自定义 AVCodecContext 参数。 (例如:宽度、高度、比特率等)
  • 添加这段代码:
    if (formatContext->oformat->flags & AVFMT_GLOBALHEADER)
    videoCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
  • 打开 AVCodecContext 变量(使用 avcodec_open2)
  • 将 AVCodecContext 编解码器结构复制到 AVStream 编解码器中(使用 avcodec_parameters_from_context)

  • 从这一点开始,您将能够创建帧并将其添加到输出文件中。
    PS:我用作此实现代码引用的示例可在 doc/examples/muxing.c 上获得

    关于ffmpeg - 替换 libav 中已弃用的 AVStream 编解码器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71565636/

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