在我的应用程序中,我使用声音库 Beads(这个问题不是专门针对该库的)。
库中有一个类WavePlayer
。它需要一个Buffer
,并通过迭代Buffer
来产生声波。
Buffer
只是封装一个 float[]
。
例如,这是缓冲区的开头:
0.0 0.0015339801 0.0030679568 0.004601926 0.0061358847 0.007669829 0.009203754 0.010737659 0.012271538 0.0138053885 0.015339206 0.016872987 0.01840673 0.019940428 0.02147408 ...
它的大小是 4096 个 float
值。
使用WavePlayer
对其进行迭代可创建平滑的“正弦波”声音。 (这个缓冲区实际上是 Buffer
类中现成的“预设”,即 Buffer.SINE
)。
我的问题是:
这样的缓冲区代表什么类型的数据?它包含什么样的信息,允许人们对其进行迭代并产生音频波?
最佳答案
阅读这篇文章What's the actual data in a WAV file?
声音只是一条曲线。您可以使用整数或 float 表示该曲线。
有两个重要方面:位深度和采样率。首先让我们讨论位深度。列表中的每个数字(整数/ float )代表给定时间点的声音曲线的高度。为简单起见,使用 float 时,值通常从 -1.0 到 +1.0 变化,而整数可能从 0 到 2^16 变化。重要的是,这些数字中的每一个都必须存储到内存中的声音文件或音频缓冲区中 - 分辨率/保真度您选择表示该曲线的每个点都会影响音频质量和最终的声音文件大小。低保真度记录每次曲线高度测量可使用 8 位信息。当您攀爬保真度谱时,16 位、24 位……专用于存储每个曲线高度测量值。更多位相当于 float 的有效位数或更宽范围的整数(16 位意味着您有 2^16 个整数(0 到 65535)来表示任何给定曲线点的高度)。
现在讨论第二个方面的采样率。当您除了测量曲线高度之外还捕获/合成声音时,您必须决定测量(采样)曲线高度的频率。典型的 CD 质量每秒记录(采样)曲线高度 44100 次,因此采样率为 44.1kHz。低保真度采样频率较低,超保真度采样频率为 96kHz 或更高。因此,曲线高度测量保真度(位深度)与执行此测量的频率(采样率)相结合,共同定义了声音合成/录音的质量
与许多事情一样,这两个属性应该保持平衡......如果你改变一个属性,你应该改变另一个......所以如果你降低采样率,你就会减少信息负载,从而降低音频保真度.. .完成此操作后,您还可以降低位深度,而不会进一步影响保真度
关于audio - 如何用一长串 float 来表示音频波?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25941986/