2010-02-11 3 views
2

Java 게임에서 사운드를 재생하는 방법?

다음 코드를 사용하여 Java (1.5) 애플릿 게임에서 사운드를 성공적으로 재생합니다.

// get an available clip to play it 
Clip clip = null; 
for (Clip clipTemp : players) { 
    if (!clipTemp.isOpen()) { 
    clip = clipTemp; 
     break; 
    } 
} 
if (clip == null) { 
    // no available player found, don't play 
    return; 
} 

clip.open(audioFormat, audioByteData, 0, audioByteData.length); 

clip.start(); 

(플레이어는 처음에 대기 시간을 줄이기 위해 열어 놓은 클립 목록, 정지 이벤트가 검색 될 때 라인을 닫습니다.)

내가 겪고있는 문제는 사운드를 재생할 때 최대 1 초의 간헐적 인 지연입니다. 이것은 꽤 가난합니다.

이것을 향상시킬 방법이 있습니까? SourceDataLines은 가치가 있습니까?

답변

2

Java Applet은 재생할 때마다 클립을 스트리밍하므로 사운드 파일이 아직 메모리에로드되지 않아 지연이 발생합니다.

Java 애플릿 프로그래밍을 수행 한 지 오래되었지만 모든 클립을 미리로드 한 다음 재생 호출이 파일을 다시 열지 않았던 것을 기억합니다. 여기

내가 제대로 코드를 읽고있다, 당신은 개봉 클립을 재생하기 전에 개방을 찾는 내 옛날 프로젝트

Clip shoot; 

private loadShootWav() 
{ 
    AudioInputStream sample; 
    sample = AudioSystem.getAudioInputStream(this.getClass().getResource("shoot.wav")); 
    shoot = AudioSystem.getClip(); 
    shoot.open(sample); 
} 

public void playShootSFX() 
{ 
    shoot.stop(); 
    shoot.setFramePosition(0); 
    shoot.start(); 
} 
+0

안녕하세요 - 답변 해 주셔서 감사합니다. 동일한 사운드가 여러 번 재생되어야 할 수도 있습니다. 당신은 전에 각 음향 효과에 대해 여러 클립을 풀링한다고 제안 해 주시겠습니까? – Pool

+0

예 - 일반적으로 모든 클립을로드하는 'SoundManager'싱글 톤 클래스를 구현합니다. 위의 코드는 사운드를 여러 번 재생하지만 매번 클립을 재설정합니다. 동일한 사운드의 5 번 플레이를 말하고 약간 다른 간격으로 섞어서 5 개의 클립을로드 한 다음 playSFX()를 호출하면 재생할 다음 클립을 가리키는 카운터를 증가시키는 것이 좋습니다. . – JSmyth

+0

@JSmyth 이처럼 뭔가를하고 있어요,하지만 같은 소리 파일의 여러 AudioInputStream 열면 LineUnavailableException 점점 시작합니다. 내 질문 좀 봐 줄래? http://stackoverflow.com/questions/20184650/why-am-i-getting-this-lineunavailableexception – trusktr

0

중 하나에서 일부 코드입니다. 열린 클립을 가져 와서 다시 시작하는 것이 더 빠릅니다. JSmyth가 playShootSFX() 예제에서 보여 주듯이, 먼저 위치를 정지하고 재설정해야 할 수도 있습니다.

나는 SourceDataLines에서 꽤 좋은 반응을 얻고있다. 좋은 점은 미개봉 클립보다 빨리 시작한다는 것입니다. 사운드의 모든 데이터가 RAM에로드 될 때까지 기다리지 않고 즉시 시작하기 때문입니다 (클립을 열 때마다 발생).

하지만 자주 들리는 작은 소리가 많은 경우 클립 풀을 사용하는 것이 좋습니다. 그것들을 겹쳐지기를 원한다면, 또는 항상 끝까지 연주하면 여러 복사본이 필요합니다. 그렇지 않은 경우 중지하고 0으로 재설정하고 다시 시작하십시오. 그러나 재개하지 마십시오! 그렇게하고 있다면 SourceDataLine을 사용할 수도 있습니다.

+0

몇 가지 문제가 있습니다. 나는 당신이 여기서 언급 한 것을 할 필요가 있다고 생각합니다. 예제를 게시 할 수 있습니까? 여기 내 질문 : http://stackoverflow.com/questions/20184650/whyamami-i-getting-this-lineunavailableexception – trusktr

+0

링크 된 게시물을 보면, 이미 문제를 해결 한 것 같습니다. 아주 좋아! 나는 구슬을 나 자신 시도하지 않았다 그러나 재미있는보기 위하여. 여러 재생을 지원하기 위해 TinySound 라이브러리에 대한 좋은 소식을 들었습니다. 대부분 내 자신의 코드를 사용하고 있지만. –

+0

달콤한. 나는 TinySound를 조사해야 할 것이다. 비드는 입력을 연결하고 출력을 외부 기계 입력에 연결할 수있는 "기계"(내가 말하는 것)를 제공하기 때문에 좋습니다. 효과 등으로 사운드를 필터링 할 수 있습니다.멋진 점은 최종 출력을 생성하기 위해 모든 시뮬레이션 된 사운드의 값을 함께 추가하여 데이터 라인을 자동으로 처리한다는 점입니다. – trusktr