android - 了解录音机 read() 缓冲区

标签 android audio byte

<分区>

我真的希望有人能帮助我。我目前正在使用 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)

关于android - 了解录音机 read() 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986385/

相关文章:

java - 在 Java 中播放 .mp3 和 .wav?

audio - 防止 libavformat (FFmpeg) 将 "ENCODER"标签添加到输出/帮助剥离标签

python - 为什么 Python 和 wc 在字节数上不一致?

android - 使用真实实现(类)进行单元测试

java - 底部导航栏(布局)通过键盘向上移动

java - 如果帧大小> 1,则Java AudioInputStream IOException无法读取单个字节

mysql - 帮助初学者了解 MySQL 文档字节定义

java - android 让 "final"被捡起来进行 GC

android - 如何从 parse.com 获取日期并将其设置为 Android 中的 MM/DD/YYYY

c# - 为什么我不能对字节执行 bool 逻辑?