0

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 が競合しているようです。この競合を解決するにはどうすればよいですか?

4

1 に答える 1

1

ここの回答の berry150 のコードに基づいて、MP3SPI と JAAD を一緒に使用するための解決策を見つけました: JAAD stoping other providers from working。まず、JLayer、MP3SPI、および Tritonous Share が JAAD の前にロードされるように、クラスパスで jar を注文する必要があります。次に、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 の場合、JAR が最初にロードされたので、Javasound からの getAudioStreamMethod() が最初に呼び出されます。オーディオが .m4a の場合、ACCAudioFileReader() の新しいインスタンスが作成され、JAAD ライブラリの getAudioInputStream() が呼び出されます。

于 2013-07-24T18:15:27.293 に答える