【问题标题】:How to extract audio form video using ffmpeg in C++?如何在 C++ 中使用 ffmpeg 从视频中提取音频?
【发布时间】:2015-08-25 07:19:54
【问题描述】:

我正在开发一个使用 FFmpeg 播放音频/视频的 C++ 应用程序。现在我想增强应用程序以允许用户从视频中提取音频。 FFmpeg 如何用于此目的?我对此进行了很多搜索,但找不到有关它的教程。

【问题讨论】:

  • 这个问题是too broad。可能的答案太多,或者对于这种格式来说,好的答案太长了。请添加详细信息以缩小答案范围或隔离可以在几段中回答的问题。
  • 基本上我的问题是如何使用 ffmpeg lib 从 c/c++ 中的视频中提取音频
  • 见官方filtering_audio例子。它将音频帧(经过一些过滤)传递给 stdout。如果您愿意,可以很容易地禁用这些过滤器。

标签: c++ ffmpeg libav


【解决方案1】:

你需要

  1. 打开输入上下文 [avformat_open_input]
  2. 获取流信息[avformat_find_stream_info]
  3. 获取音频流:
if (inputFormatContext->streams[index]->codec->codec_type ==
    AVMEDIA_TYPE_AUDIO) {
  inputAudioStream = inputFormatContext->streams[index];
}
  1. 读取每个数据包。 AVPacket 数据包;
int ret = av_read_frame(inputFormatContext, &packet);
if (ret == 0) {
  if (packet.stream_index == inputAudioStream->index) {
    // packet.data will have encoded audio data.
  }
}

【讨论】:

  • 您可以保存为任何容器格式。使用 avformat_alloc_output() 打开输出格式上下文,以写入模式 avio_open 打开文件,使用 avformat_write_header() 写入头部,使用 av_interleaved_write_frame 写入数据,使用 av_write_trailer 写入尾部。你也可以参考 ffmpeg/muxing.c.
  • 我尝试使用上面的链接,但是行“avformat_alloc_output_context2(&oc, NULL, NULL, filename);”给出对 avformat_alloc_output_context2 的未定义引用的错误
  • 你能写出伪代码以便我能写出正确的c代码
  • 你可以有一个小而完整的例子,这样每个人都更容易理解。
【解决方案2】:

这似乎是一个简单的脚本任务...为什么要使用重型火炮 (C/C++) 打击苍蝇?

我使用 Applescript 通过 Bash shell 构建/运行 ffmpeg 命令行。我涉及 Applescript 的唯一原因是我可以将它作为一个液滴调用(即将文件拖放到应用程序上并让它在没有交互的情况下运行。)

我知道您可能在 Windows 上,这意味着没有 Applescript 和 Bash。但肯定比 C 更轻的东西可以构建/运行 ffmpeg 命令行。真的很简单:

ffmpeg -i infile.mp4 -b 160k outfile.mp3

【讨论】:

  • 我这样做是为了为我的 android 应用创建本机代码。
  • OP 指出他们正在制作 C++ 应用程序。这个答案一点用处都没有。
猜你喜欢
  • 2012-04-12
  • 2018-05-09
  • 1970-01-01
  • 2023-02-07
  • 2021-11-04
  • 2021-02-26
  • 1970-01-01
  • 2015-12-31
相关资源
最近更新 更多