了解Audio Recorder的read()缓冲区

时间:2014-02-24 11:26:10

标签: android audio byte

我真的希望有人可以帮助我。我目前正在使用Android“Audio Recorder”,一切正常。下一步是在调用read()时处理从缓冲区返回的字节。

作为Web开发人员退出一段时间,我缺乏一些基础 - 主要是存储在那里的字节。我真的很想理解,从这个方法回来的字节是什么。我真的觉得我需要一些基础知识,主要是如何分析那里的东西(我想知道是否有声音和声音有多大而且不仅仅是代码,我真的很想知道那里发生了什么)。

有人会非常友好地给我链接文章/博客/书籍我可以阅读以获得有关此音频分析的更多知识吗?

1 个答案:

答案 0 :(得分:9)

根据我的经验,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)