分析 WAV 文件中的声音

Ste*_*eph 5 java audio wav

我试图通过将电影文件分成相机镜头来分析它,然后尝试确定哪些镜头比其他镜头更重要。我考虑的一个镜头重要性的因素之一是电影该部分的音量有多大。为此,我正在分析相应的声音文件。我无法确定一个镜头的“响度”有多大,因为我认为我没有完全理解 WAV 文件中的数据代表什么。

我使用与本文中描述的方法类似的方法将该文件读入音频缓冲区。

已经将相应的视频文件分割成多个镜头后,我现在试图找出 WAV 文件中哪些镜头比其他镜头声音更大。我试图通过提取文件中的每个样本来做到这一点,如下所示:

double amplitude = (double)((audioData[i] & 0xff) | (audioData[i + 1] << 8));
Run Code Online (Sandbox Code Playgroud)

我读过的其他一些帖子似乎表明我需要对此音频数据应用快速傅里叶变换来获取幅度,这让我想知道我提取的值实际上代表什么。我正在做的事情正确吗?我的声音文件格式是 16 位单声道 PCM,采样率为 22,050 Hz。当我尝试分析文件的体积时,是否应该对这个 22,050 值执行某些操作?其他帖子建议使用均方根来评估响度。这是必需的,还是只是一种更准确的方法?

我越研究这个问题就越困惑。如果有人能够阐明我的错误和误解,我将不胜感激!

Kil*_*oth 3

FFT 与音量无关,而与频率有关。要了解场景的平均声音大小,只需对采样值进行平均即可。根据您获取的数据是用您的语言作为有符号值还是无符号值,您可能必须首先应用绝对函数,以便负幅度不会抵消正幅度,但仅此而已。如果您没有得到预期的结果,则一定与您在第 20 行中提取各个值的方式有关。

也就是说,有一些改进可能会或可能不会影响您的任务。感知的响度、幅度和声功率实际上以非线性方式相关,但只要您只是想粗略估计音频信号中“发生”的情况,我怀疑这与您相关。当然,人类听到不同频率的效果更好或更差——例如,蝙蝠发出的超声波尖叫声对我们来说绝对是震耳欲聋的,但幸运的是我们根本听不到它们。但我再次怀疑这与您的任务相关,因为例如高于 22kHz 的频率(或者是 44kHz?不确定哪个)实际上无法以简单的 WAV 格式表示。