工具类
java
import lombok.extern.slf4j.Slf4j;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@Slf4j
public class WavUtils {
public static double getDecibels(String url) {
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(URI.create(url).toURL());
return doCal(audioInputStream);
} catch (UnsupportedAudioFileException | IOException e) {
return Double.MAX_VALUE;
}
}
public static double getDecibels(InputStream inputStream) {
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream)) {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bufferedInputStream);
return doCal(audioInputStream);
} catch (IOException | UnsupportedAudioFileException e) {
return Double.MAX_VALUE;
}
}
private static double doCal(AudioInputStream audioInputStream) throws IOException {
AudioFormat audioFormat = audioInputStream.getFormat();
if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
audioFormat.getSampleRate(),
audioFormat.getSampleSizeInBits() * 2,
audioFormat.getChannels(),
audioFormat.getFrameSize() * 2,
audioFormat.getFrameRate(),
true);
audioInputStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream);
}
byte[] buffer = new byte[4096];
int bytesRead;
double sum = 0;
int count = 0;
while ((bytesRead = audioInputStream.read(buffer)) != -1) {
for (int i = 0; i < bytesRead; i += 2) {
// 将字节数据转换为 16 位有符号整数
short sample = (short) ((buffer[i + 1] << 8) | buffer[i]);
// 计算样本的振幅
double amplitude = sample / 32768.0;
// 计算振幅的平方并累加
sum += amplitude * amplitude;
count++;
}
}
double rms = Math.sqrt(sum / count);
double decibels = 20 * Math.log10(rms);
decibels = Math.abs(decibels);
log.info("decibels: {}", decibels);
return decibels;
}
}
测试类
java
@Test
public void testDb() {
try (FileInputStream stream = new FileInputStream("/path/to/file")) {
double decibels = WavUtils.getDecibels(stream);
} catch (Exception e) {
}
double decibels = WavUtils.getDecibels("url");
}