2013-07-24 1 views
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은 충돌하는 것으로 보입니다. 이 충돌을 어떻게 해결할 수 있습니까?

+0

하나의 API를 사용하십시오. 'jLayer'는'MP3'를 재생할 수 있어야하지만'mp4'에 대해서는 확실하지 않습니다 – MadProgrammer

+1

나는 이미 JLayer를 사용해 보았습니다. 문제는 일시 중지, 다시 시작, 전달 등의 고급 기능에서는 매우 유연하지 않다는 것입니다. MP3SPI를 사용하면 스트림을 직접 처리하여 모든 것을 쉽게 처리 할 수 ​​있습니다. 그래서 나는 오히려 Javasound를 계속 사용하고 있습니다. – amb110395

+0

후자의 API가 MP4 용 SPI를 제공하는지 확인하십시오. 그렇다면 단순히 런타임 클래스 경로에 추가하고 Java Sound를 사용할 수 있어야합니다. –

답변

1

글쎄, 나는 여기에 답변에서 berry150의 코드를 기반으로 MP3SPI와 JAAD를 함께 사용하는 솔루션을 발견했다 : JAAD stopping other providers from working. 먼저 JAAD 전에 JLayer, MP3SPI 및 Tritonous Share가로드되도록 클래스 패스에서 jar를 정렬해야합니다.

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()가 먼저 호출 될 것입니다 : 그런 다음 AudioInputStream를을 얻기 위해, 다음 코드를 사용합니다. 오디오가 .m4a 인 경우 ACCAudioFileReader()의 새 인스턴스가 만들어지고 JAAD 라이브러리의 getAudioInputStream()이 호출됩니다.

+1

이 문제도 발생했습니다. 환상적으로 도움이된다! – metasim