2011-08-18 8 views
0

솔브레드자바 클립 (소리가납니다) 효과적으로 재생되지 않습니다.

Runnable에 문제가있어서 실제로 두 개의 게임 스레드가 동시에 실행되고있었습니다. (문제는 같았습니다!) 따라서 오디오 플레이어에 부딪힌 두 번째 스레드가 오류를 일으켰습니다. 왜 그것이 에코로 들렸는지, 그것은 두 개의 다른 스레드에서 재생 중이었습니다!

긴 사운드 클립을 사용하기 위해 제안 된대로 SourceDataLine도 사용하고 있습니다.


이 코드 화재는 오류가 clip.open() 라인에서

IllegalStateException: Mixer is already open

말 팝업

원래 포스트. 코드가 두 번 실행되는지 확인하기 위해 모든 방법을 사용했습니다. 그러나 오류가 있더라도 사운드는 계속 재생됩니다. 긴 클립 (30 초)에서는 다른 2 개의 사운드가 재생되는 것처럼 들립니다. 정말로 긴 클립 (3 분)에서는 소리가 더듬입니다.

은 (stringFile"example.wav" 같은 String입니다)이 질문은 이미 게시 된 경우

File soundFile = new File(stringFile); 
AudioInputStream inputStream = AudioSystem.getAudioInputStream(soundFile); 
AudioFormat format = inputStream.getFormat(); 
DataLine.Info info = new DataLine.Info(Clip.class, format); 
clip = (Clip) AudioSystem.getLine(info); 
clip.open(inputStream); 
clip.start(); 
playing = true; 

, 정말 죄송합니다. 검색 한 결과이 스레드와 비슷한 스레드가 발견되지 않았습니다.

+0

[BigClip] (http://stackoverflow.com/questions/5667454/playing-audio-file-in-java-application/5668510#5668510)을 사용하면 더 많은 행운을 누릴 수 있습니다. BTW - 어떤 OS 및 Java를 실행하고 있습니까? 비 Sun * nix JRE는 임의로 크기가 지정된 'Clip' 인스턴스를 허용했지만 (구현은 일반적으로 버그가 있음) Sun/Oracle의'Clip '은로드 할 수있는 사운드의 길이가 매우 제한되어 있습니다. –

+0

감사합니다. 리눅스 민트, 그리고 openjdk 또는 태양 자바를 사용하여, 이클립스가 무엇을 사용하고 있는지 확실하지 않습니다. P ill try BigClip. – khyperia

답변

0

클립 만 사용하면 클립을 메모리에서 유지하고 파일에서 다시로드 할 필요없이 여러 번 호출 할 수 있습니다.

따라서 시작 및 중지하려면 myClip.open(), myClip.start(), myClip.stop()을 사용하고 다시 재생하려면 myClip.setFramePosition (0) 및 myClip.start() 내가 튜토리얼을 올바르게 읽으면. (난 그냥 SourceDataLines 함께 일하는, 보통, 그래서 내가 잘못 생각하면 용서하십시오.)

때마다 파일에서 그것을 다시로드하는 경우 문제의 원인이 될 수 있습니까? 어쨌든, 나는 SourceDataLine으로 전환하는 것을 고려할 것이다. 무엇보다도 이것은 클립 재생을 시작하기 전에 전체 클립을 메모리에로드해야하는 오버 헤드를 제거합니다.

30 초는 많은 양의 RAM입니다. 30 * 44100 = 1.323 MB (프레임 당 1 바이트 만 있으면보다 일반적인 wav 형식은 그 크기의 4 배입니다). 따라서 더 이상 소리가 들리지 않으면 말더듬이를 유발할 수있는 페이지 스와핑 포인트까지 RAM에 과세 할 수 있습니다.

+0

내가 게시 한 코드는 초기로드이며 재생하지 않습니다. SourceDataLine을 살펴 보았지만 사운드 파일의 실제 바이트를 너무 복잡하게해서 플레이어에 수동으로 입력하는 것처럼 보입니다. 어디서부터 시작해야할지 모르겠다! 내가 시도한 모든 것은 실패했다. – khyperia

+0

2시 30 분에 집중적으로 공부 한 후, 신경 쓸 필요가 없습니다. – khyperia

+0

@khyperia - 축하해! 예. 처음으로 SDL을 작동시키는 것은 어려웠습니다. 그러나 일단 당신이 그것을 갖게되면, 그것은 당신에게 훨씬 더 많은 과정 통제를 제공합니다.내부 바이트 버퍼 피드에 액세스 할 수 있음 : 프레임 단위로 볼륨 조절 및 재생 속도 조절을 시작했으며 간단한 필터링 및 기타 효과에 대해 살펴 보았습니다. –

관련 문제