ffmpeg 获取音频文件PCM切片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg 获取音频文件PCM切片相关的知识,希望对你有一定的参考价值。

参考技术A 背景:为测试听歌识曲的sdk是否准确,获取一批测试音频(MP3格式) 的pcm 数据

首先去ffmpeg 官网上获取相应工具 

https://ffmpeg.zeranoe.com/builds/

一共有三种类型可供选择,在这里只需要选择 static builds(选择相应系统)

解压后,从bin目录下可以看到有三个可执行文件。大概功能为:

ffmpeg.exe     也是这里的主角,可以负责音频格式的转换。

ffplay.exe         一个播放器

ffprobe.exe      集多媒体文件或流的信息,并以人和机器可读的方式输出

通过调用命令行 

ffmpeg -ss 4 -t 16 -i input.mp3 -f s16le -acodec pcm_s16le -b:a 16 -ar 8000 - ac 1 output.raw

相应配置项的解释:

这一段获取的output 文件为    input.mp3  从4s 开始到20s  的数据 ,转存为 采样率8000khz,声道为单声道,位深为16bit  的pcm 原始数据 

测试:

结果:

这点之前也不知道,后来查看到工具 Adobe Audition

使用该软件打开raw文件,选择相应的编码格式。

就可以直接播放该PCM数据了

这里从github 找到了个能获取mp3 时长的库:

https://github.com/devsnd/tinytag

脚本存到在:

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

【中文标题】如何使用 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 获取音频文件PCM切片的主要内容,如果未能解决你的问题,请参考以下文章

使用ffmpeg保存PCM文件

FFMPEG 音频封装编码

最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

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

ffmpeg 音轨提取

如何将 FFMPEG AV_CODEC_ID_PCM_S16BE 音频数据馈送到 AudioQueue