avformat_write_header 尝试使用 G711U 音频 avi 文件写入视频时返回错误代码

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

我正在尝试从视频/音频流制作 avi 文件。当音频是 AAC 时,它工作正常。但我无法打包G711U音频。

  av_register_all();
  avcodec_register_all();
  av_log_set_callback(nullptr);

  av_format_context_ = avformat_alloc_context();
  if (!av_format_context_)
  {
    std::string error_msg = "Failed to allocate avformat context";
    log_->Error(error_msg);
    throw std::runtime_error(error_msg.c_str());
  }

  av_format_context_->oformat = av_guess_format("mp4", filename.c_str(), NULL);
  strcpy(av_format_context_->filename, filename.c_str());

  AVCodec* codec = avcodec_find_encoder(AV_CODEC_ID_PCM_MULAW);
  av_format_context_->oformat->audio_codec = codec->id;

  audio_stream_ = avformat_new_stream(av_format_context_, codec);
  if (audio_stream_ == nullptr)
  {
    log_->Error("Can not create audiostream.");
    return false;
  }

  AVCodecContext& codec_context = *audio_stream_->codec;
  if (avcodec_copy_context(audio_stream_->codec, av_format_context_->streams[1]->codec) != 0)
  {
    log_->Error("Failed to Copy Context");
    return false;
  }

  audio_stream_->time_base = { 1, codec_context.sample_rate };

  if (av_format_context_->oformat->flags & AVFMT_GLOBALHEADER)
    codec_context.flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

  log_->Info("Init output {}", filename);
  av_dump_format(av_format_context_, 0, filename.c_str(), 1);

  int ret = avio_open(&av_format_context_->pb, filename.c_str(), AVIO_FLAG_WRITE);
  if (ret < 0)
  {
    log_->Error("Can not open file for writing.");
    return false;
  }

  ret = avformat_write_header(av_format_context_, NULL);
  if (ret < 0)
  {
    log_->Error("Can not write header.");
    return false;
  }

这里 avformat_write_header() 返回 -22。这是怎么回事?我应该向该函数提供哪些数据?

c++ ffmpeg pcm libav avi
1个回答
0
投票

在您的代码中,您尝试创建 MP4 容器格式输出文件而不是 AVI:当您在 av_guess_format 中提供短名称作为第一个参数时,它比文件扩展名更有权重来决定输出格式(https://www.ffmpeg .org/doxygen/0.6/libavformat_2utils_8c-source.html#l00198)。

MP4 容器不支持包括 G.711 在内的 PCM 数据。请查看此页面了解详细信息https://en.wikipedia.org/wiki/Comparison_of_video_container_formats

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