I';我正在尝试使用java';它的API很好,但它是天堂';我没能弄明白
我将要处理很多音频文件,我不需要播放这些文件,但我希望能够以固定的间隔(例如每秒)获得音量水平,这样我就可以大致绘制整个文件的总体音量水平。我使用java Sound API读取文件的帧,但我不确定如何解释它们(我不确定如何处理little endian以及如何将帧拆分为两个通道),我尝试将AudioInputStream发送到SourceDataLine,并每秒在dataline上调用getLevel(),但是它总是返回0。如果您对PCM进行了签名,则从字节解码的值的范围将为Java短整数(-32768到32767)。不过,声波的本质是来回扫频,因此在任何一帧中,声波的值几乎可以在任何地方,因此与你听到的音量没有很好的相关性 所以,我想你需要看很多样本,然后做一些总体分析。也许将所有与0的偏差相加为绝对值,然后除以帧数?需要多少帧?好吧,如果我们想包括,比如说,周期为50 cps的低音声波,并且要确保包括整个周期,那就是整整一秒帧的1/50。如果采样率为44100fps,则为8805帧!但也许使用这个滚动平均值会扭曲附近其他频率值的贡献 注意,我大部分是自学成才的,所以可能有更好的方法 下面是我用来将小尾端轨迹的帧转换为-1和1(呃,0.999…)之间的浮点的代码行,其中缓冲区是一个字节数组:I';我正在尝试使用java';它的API很好,但它是天堂';我没能弄明白,java,wav,audio-streaming,audio,Java,Wav,Audio Streaming,Audio,我将要处理很多音频文件,我不需要播放这些文件,但我希望能够以固定的间隔(例如每秒)获得音量水平,这样我就可以大致绘制整个文件的总体音量水平。我使用java Sound API读取文件的帧,但我不确定如何解释它们(我不确定如何处理little endian以及如何将帧拆分为两个通道),我尝试将AudioInputStream发送到SourceDataLine,并每秒在dataline上调用getLevel(),但是它总是返回0。如果您对PCM进行了签名,则从字节解码的值的范围将为Java短整数(-
float audioVal = (float)( ( ( buffer[i+1] << 8 )
| ( buffer[i] & 0xff ) ) / 32768.0 );
float audioVal=(float)((缓冲区[i+1]