背景:我正在使用JLayer播放MP3
文件。我正在尝试分析MP3
. 通过我的分析,我想确定MP3
. 此外,在MP3
播放时,我想要一个图表来显示音频电平(如视觉声波)。
问题:为了进行有效的分析,我需要能够分析原始PCM
数据。目前,我正在分析通过 byte[] 检索AudioInputStream
并发送到SourceDataLine
. 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);
}
}
本质上:我如何PCM
在播放时现场解码数据MP3
,以便我可以显示音量级别并因此检测静音?