实时音频分析 Android

Posted

技术标签:

【中文标题】实时音频分析 Android【英文标题】:Real time audio analysis Android 【发布时间】:2022-01-17 01:27:43 【问题描述】:

我有一个相当复杂的问题需要在工作中解决。这远远超出了我“android 应用程序开发人员”的职权范围——我会将其归类为一个非常专业的音频工程问题。

我的任务是开发一个应用程序,该应用程序需要能够将本地音频文件或来自流媒体服务应用程序(例如但不限于 Spotify)的音频通过蓝牙传输到另一台设备。

此外,应用程序需要能够估计流式音频的 BPM(假设所有音频都是音乐)并使用此 BPM 值来控制灯光序列的播放速度。

这个问题是关于如何估计流媒体音乐的 BPM。

对于音频文件在本地的情况,我可以考虑一些解决方案,例如将 BPM 硬编码到应用程序中,在针对音频资源 URL 的映射中。

我还研究并试验了“静态”库 (aubio),它可以从音频文件中估计 BPM,但不能即时估计。它采用 .wav 格式。这对于我们在这里想要实现的目标来说是不够的。

但是,鉴于需要从 Spotify 等流媒体服务应用流式传输外部音频,静态分析解决方案毫无意义,因为该解决方案不适用于流媒体服务案例,而流媒体服务案例解决方案适用于这两种情况.

因此,我得出的结论是,我需要以某种方式即时分析流式音频,可能使用 FFT 或峰值检测算法。

这个问题不是关于实际的 BPM 估计算法本身(或我将如何到达那里的实现细节),而是关于这种解决方案的基本起点:

我该如何获取 A) 本地文件案例和外部流媒体服务应用案例的流式音频的原始字节以及 B) 我如何将这些字节处理成以某种方式表示音频流的数据结构适合在其上运行音频分析算法。

我意识到这是一个非常开放、非常模糊的问题,但这远远超出了我的舒适区,我什至不知道如何提出一个更连贯的问题。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我会首先为不同的部分创建一些单独的、定义更严格的问题。例如,询问如何在流式传输本地文件或流式传输 URL 来源的音频时访问原始字节。 Android 对流式传输有一些很好的支持,包括流式传输 PCM 的能力,所以如果无法获得访问字节流的挂钩,我会感到非常惊讶。

一旦你有了一个挂钩点,为了将字节转换为“有用的东西”,我会考虑使用音频格式来告诉你如何读取传入的字节。格式应该告诉你有多少通道(单声道或立体声),编码(例如,有符号的 PCM 是常见的,可能是标准化的浮点数),每个值的位数(16 是常见的)和字节的顺序(big-字节序与小字节序)。

我知道有些帖子会解释如何根据这些信息将原始音频字节转换为 PCM 值,包括一些关于 *** 的帖子。它们应该可以通过搜索访问。我认为有符号的标准化浮点数是用于处理音频信号的最常见的数据表示。

【讨论】:

谢谢菲尔 - 看来我还有很多事情要做。

以上是关于实时音频分析 Android的主要内容,如果未能解决你的问题,请参考以下文章

实时音频编解码之十三 Opus编码-SILK编码-噪声整形分析

实时音频编解码之十三 Opus编码-SILK编码-噪声整形分析

使用 C 在 Windows 上捕获和分析音频

AndroidAndroid反编译之enjarify的使用与解读

如何实时收听麦克风输入并进行分析?

实时音频编解码之七 预加重