声音数据格式

Posted

技术标签:

【中文标题】声音数据格式【英文标题】:format of sound data 【发布时间】:2012-07-31 12:41:09 【问题描述】:

从 Java 中的流中读取声音数据的低级实际格式是什么?例如,使用以下数据线,44.1khz 采样率,16 位采样深度,2 个通道,有符号数据,bigEndian 格式。

TargetDataLine tdLine = new TargetDataLine(new AudioFormat(44100,16,2,true,true));

我知道它每秒采样 44100 次,每个采样是 16 位。我不明白 16 位或 16 位中的每一个代表什么。另外,每个通道都有自己的 16 位采样吗?

【问题讨论】:

这16位组成一个数字,就是那个离散采样时声波的幅度,最终测得的值在-1到1之间。但是为什么底层数据格式重要吗? 我希望能够通过数据读取并挑选出特定频率的实例。 那你需要多学习more than the digital audio basics。 :) 扩展@IronMensan's answer,部分采样声音中包含的频率是振动膜在移动时产生的所有声波的波长。 This is computable,但很复杂,不是一门精确的科学。 【参考方案1】:

我先从你的最后一个问题开始,是的,每个通道对于每秒 44100 个样本中的每一个都有自己的 16 位样本。

至于你的第一个问题,你必须了解扬声器内部的硬件。有隔膜和电磁铁。隔膜是一个大的圆形部分,如果你取下盖子,你可以看到。当电磁体充电时,它会拉动或推动连接在隔膜上的铁板,使其移动。那个动作变成了声音。

每个样本的值是发送到扬声器的电量。因此,当样本为零时,隔膜处于静止状态。当它为正时,它被推向一个方向,当它为负时,它被推向另一个方向。样本越大,隔膜移动的越多。

如果您将数据中的所有样本绘制成图表,您将获得一个扬声器随时间移动的图表。

【讨论】:

【参考方案2】:

您应该了解Digital Audio Basics(Wiki 为您提供了一个起点和大量链接,供您进一步阅读)。之后44.1khz 采样率、16 位采样深度、2 个通道、签名数据、bigEndian 格式应该会立即告诉您低级格式。

在这种情况下,它意味着 44100 个样本/秒,代表每个样本的 16 位 有符号 整数,最后 endianess 确定将 16 位 int 的字节放入的顺序流(大端 = 最高有效字节在前)。

【讨论】:

以上是关于声音数据格式的主要内容,如果未能解决你的问题,请参考以下文章

在 XCode 中添加声音时应该使用哪种格式?

转wave 文件解析

音频数据文件格式(PCM,WAV,MIDI)简记

为啥微信中看视频只有声音,没有图像?

用于处理声音文件的 iOS 框架

目标c中的音频文件格式问题