如何使用 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 编码音频?的主要内容,如果未能解决你的问题,请参考以下文章