如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?

Posted

技术标签:

【中文标题】如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?【英文标题】:How do you encode raw pcm_f32le audio to AAC encoded audio with FFmpeg (C/C++)? 【发布时间】:2020-01-17 02:12:23 【问题描述】:

我正在尝试将原始音频 (pcm_f32le) 编码为 AAC 编码音频。我注意到的一件事是我可以通过 CLI 工具完成此操作:

ffmpeg -f f32le -ar 48000 -ac 2 -c:a pcm_f32le -i out.raw out.m4a -y

这玩得很好,解码也很好。

我采取的步骤:

    当我使用 C 示例代码时:https://ffmpeg.org/doxygen/3.4/encode_audio_8c-example.html 并将编码器切换到 codec = avcodec_find_encoder(AV_CODEC_ID_AAC);

    输出与AAC相关的各种样本格式,它只提供FLTP。这采用平面/交错格式。

    这个page 似乎为每个编解码器提供了各种支持的输入格式。

这很令人困惑,因为我不认为我捕获的原始音频是交错的。我当然尝试过通过它,但它没有按预期工作。

在调用avcodec_receive_packet 后,它将无限期地停留在此 ret 代码中:

AVERROR(EAGAIN):   output is not available in the current state - user must try to send input

问题:

    如何修改 FFmpeg 中的示例代码以将 pcm_f32le 原始音频转换为 AAC 编码音频?

    为什么 CLI 工具能够做到?

    我正在使用 libsoundio 从 Linux 的虚拟输出中捕获原始音频。我想知道如何通过平面格式来获取 AAC 编码的音频。

    如果无法使用 AAC,是否可以使用 MP3?

【问题讨论】:

我学到的一件事是您必须将 FLT 重新采样为 FLTP。此链接可以提供帮助:github.com/FFmpeg/FFmpeg/blob/master/libavresample/… 【参考方案1】:

查找here 一个如何使用 ffmpeg 将原始 pcm_f32le 编码为 aac 的工作示例

【讨论】:

以上是关于如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FFmpeg C/C++ 中寻找

ffmpeg记录

在ffmpeg H.264解码器中修改运动向量

我在哪里可以找到 C/C++ FFmpeg 扩展教程? [关闭]

将原始 OpenCV 图像通过管道传输到 FFmpeg

ffmpeg在开始和结束之前将广告音频文件添加到原始音频文件[重复]