我正在尝试通过将电影文件分成摄像机镜头来分析电影文件,然后尝试确定哪些镜头比其他镜头更重要。我考虑镜头重要性的因素之一是电影那部分的音量很大。为此,我正在分析相应的声音文件。我无法确定镜头的“响亮”程度,因为我不完全了解WAV文件中的数据代表什么。
我使用类似于this post中描述的方法将文件读入音频缓冲区。
在已经将相应的视频文件分割成快照之后,我现在尝试在WAV文件中查找哪些快照比其他快照响亮。我正在尝试通过提取文件中的每个样本来做到这一点,如下所示:
double amplitude = (double)((audioData[i] & 0xff) | (audioData[i + 1] << 8));
我读过的其他一些文章似乎表明我需要对该音频数据应用快速傅立叶变换才能获得振幅,这使我想知道我提取的值实际代表什么。我做的对吗?我的声音文件格式是16位单声道PCM,采样率为22,050 Hz。当我尝试分析文件的容量时,应该使用22050这个值来做些什么吗? Other posts建议使用均方根来评估响度。这是必需的,还是只是更准确的方法?
我越看越困惑。如果有人能阐明我的错误和误解,我将不胜感激!
最佳答案
FFT与音量无关,而与频率无关。要找出一个场景的平均声音大小,只需对采样值进行平均即可。取决于您是以您的语言获得的数据为带符号值还是无符号值,您可能必须首先应用绝对函数,以使负振幅不会抵消正振幅,但仅此而已。如果没有得到所需的结果,则必须与第20行中提取单个值的方式有关。
就是说,有些改进可能会或可能不会影响您的任务。感知的响度,振幅和声功率实际上是非线性相关的,但是只要您只是试图粗略估计音频信号中的“持续进行”,我怀疑这是否与您有关。当然,人类听到不同频率的声音会更好或更糟-例如, bat 发出的超声波啸叫对我们来说绝对是震耳欲聋的,但幸运的是我们根本听不到它们。但是我再次怀疑这是否与您的任务有关,例如实际上,以简单的WAV格式无法表示高于22kHz的频率(或者是44kHz吗?不确定是哪个)。