<分区>
我真的希望有人能帮助我。我目前正在使用 Android“Audio Recorder”,一切正常。下一步是处理调用 read()
时从缓冲区返回的字节。
作为一名 Web 开发人员已经有一段时间了,我缺乏一些基础知识 - 主要是关于存储在其中的字节。我真的很想了解,我从该方法中返回的字节是“什么”。看来我真的需要一些基础知识,主要是如何分析那里的东西(我想知道是否有任何声音以及声音有多大,而不仅仅是代码,我真的很想了解那里发生了什么)。
谁能给我一些文章/博客/书籍的链接,我可以阅读以获取有关此音频分析的更多知识?
根据我的经验,Android AudioRecorder 在许多平台上不能很好地处理字节。因此,将您的记录器设置为记录 16 位并使用短数组读取。
但是从那里解释实际值代表什么是相当复杂的。您获得的音频是脉冲编码调制(您可能听说过的 PCM)。这意味着您有一个固定的采样率(比如 8000Hz),并且每 1/8000 就会收到一个振幅。随着时间的推移,这些振幅会形成您可能熟悉的波形。短数组中的值就是这个振幅。
如果您熟悉扬声器的工作原理,就会知道磁铁会前后插入振膜。您获得的值表示隔膜向前或向后移动的距离(瞬时幅度)。所以在短数组中,32767 代表完全向前,-32768 代表完全向后。 0 直接介于两者之间,这是扬声器关闭时的状态。
要在扬声器示例中发出声音,您需要前后移动隔膜。要产生 50Hz 的信号,隔膜需要每秒前后移动 50 次。要创建 1000Hz 信号,它需要每秒向前或向后移动 1000 次,依此类推。可以将这些信号加在一起以创建更复杂的信号。
为它增加更多的复杂性。使用短值,您可以将扬声器振膜移动到 65536 个离散位置。这是模拟和数字音频之间的根本区别。在数字被“量化”的真正模拟录音中,振膜有无数个位置。
这是一个非常基本的解释,因为任何更复杂的东西实际上都超出了 stackoverflow 响应的范围。您可以在维基百科和其他资源上阅读更多内容。以下是一些可帮助您入门的维基百科链接:
http://en.wikipedia.org/wiki/PCM
http://en.wikipedia.org/wiki/Quantisation_(signal_processing)