我一直在尝试用Java制作我的第一个GUI音乐播放器。到目前为止,我已经能够使用Javasound和MP3SPI播放MP3。现在,我想支持.m4a歌曲,而我研究过的最佳库是JAAD。我下载了它,并将其添加到我的项目中,当我尝试播放.m4a歌曲时,它可以完美运行。当我在添加JAAD库后尝试播放.mp3时,会发生问题。我播放歌曲的代码是:
File file = new File(pathToSong);
AudioInputStream audioStream= AudioSystem.getAudioInputStream(file); // Obtains an audio input stream of the song
AudioFormat baseFormat = audioStream.getFormat(); //Obtains the audio format of the song in the audio input stream.
decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, //The type of encoding for the audio stream
baseFormat.getSampleRate(), //Sample rate of the audio stream
16, //Number of bits in each sample of a sound that has this format.
baseFormat.getChannels(), //Number of audio channels in this audio stream
baseFormat.getChannels() * 2, //Number of bytes in each frame of the audiostream
baseFormat.getSampleRate(), //Number of frames played or recorded per second, for the sound in the audio stream
false); //Data stored in little-endian order
decodedAudioStream = AudioSystem.getAudioInputStream(decodedFormat, audioStream); //Obtains an audio input stream of the indicated encoding by converting the provided audio input stream.
playSong(); //Play the song
(playSong()只需读取流并将字节写入SourceDataLine)
添加JAAD库后尝试播放.mp3时出现的错误如下:
java.io.IOException: Resetting to invalid mark
at java.io.BufferedInputStream.reset(BufferedInputStream.java:416)
at net.sourceforge.jaad.spi.javasound.AACAudioFileReader.getAudioInputStream(AACAudioFileReader.java:118)
at net.sourceforge.jaad.spi.javasound.AACAudioFileReader.getAudioInputStream(AACAudioFileReader.java:143)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1162)
at Song.run(Song.java:38)
以我的理解,似乎Javasound和JAAD的getAudioInputStream是冲突的。如何解决此冲突?
最佳答案
好吧,我找到了一个基于berry150的代码并同时使用MP3SPI和JAAD的解决方案,答案在这里:JAAD stopping other providers from working。
首先,必须在类路径中订购jar,以便在JAAD之前加载JLayer,MP3SPI和Tritonous Share。然后,为了获取AudioInputStream,请使用以下代码:
if (getAudioFormat().equals(".mp3")) {
audioStream = AudioSystem.getAudioInputStream(file); // Obtains an audio input stream of the song
}
else if (getAudioFormat().equals(".m4a")){
audioStream = new AACAudioFileReader().getAudioInputStream(file);
}
所以发生的事情是,如果音频是mp3,则Javasound的getAudioStreamMethod()将首先被调用,因为它的JAR被首先加载。如果音频为.m4a,则将创建ACCAudioFileReader()的新实例,并调用JAAD库的getAudioInputStream()。