【发布时间】:2013-09-21 23:09:58
【问题描述】:
背景:我正在使用JLayer 播放MP3 文件。我正在尝试分析MP3 中不同的幅度/音频电平。通过我的分析,我想确定MP3 开头和结尾处的沉默持续时间。此外,在播放MP3 时,我想要一个图表来显示音频电平(如视觉声波)。
问题:为了有效分析,我需要能够分析原始PCM 数据。目前,我正在分析通过AudioInputStream 检索并发送到SourceDataLine 的byte[]。 PCM 是 short[] 而不是 byte[],这意味着我没有得到完整的数据。
我正在使用Root-Mean Square (RMS) 来确定音量。
处理byte[]的播放代码:
AudioInputStream in = null;
AudioFile af = null; //Custom class which holds some data about mp3.
SourceDataLine line = null;
// Set current audio file.
af = musicPlaylist.get(0);
line = (SourceDataLine) AudioSystem.getLine(af.getLineInfo());
line.open(af.getAudioFormat());
line.start();
in = getAudioInputStream(af.getAudioFormat(), af.getAudioStream());
int bR = playbackBufferSize;
final byte[] buffer = new byte[bR];
int n = 0;
while (playMedia) {
if ((n = in.read(buffer, 0, buffer.length)) == -1) {
break;
}
if (line != null) {
line.write(buffer, 0, n);
int amp = (int) Math
.ceil((rmsAudioLevel(decode(buffer)) / 32767) * 100);
mainScreen.setAmpDisplayLevel(amp, String.valueOf(amp));
mainScreen.updateGraph(amp);
}
}
本质上:我如何在播放MP3 时现场解码PCM 数据,以便我可以显示音量级别并因此检测静音?
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖SSCCE。
标签: java mp3 javasound pcm javax.sound.sampled