2014-05-09 2 views
0

소리를 재생하는 방법이 있습니다. 처음에는 작동하지만 두 번째 연주에서는 소리가 나지 않습니다.클립을 두 번째로 재생하지 못합니다.

private AudioInputStream audio; 

public AudioTest() { 
     try { 
      audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile()); 
     } catch (UnsupportedAudioFileException | IOException e) { 
     } 

} 

그리고 사운드를 재생하는 방법 : 먼저 나는 생성자에서 인스턴스화 AudioInputStream를이

private void play() { 
     try { 
      Clip clip = AudioSystem.getClip(); 
      clip.open(audio); 
      clip.setFramePosition(0); 
      clip.start();  
     } catch (LineUnavailableException | IOException e) { 
     } 
} 

나는 오디오가 아니라 두 번째를들을 처음. 왜?

+0

더 나은 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소 완료 및 검증 가능한 예)를 게시하십시오. –

답변

0

한번에 닫는 Clip 첫째 :

clip.close(); 
+0

열기 전에 올바르게? 죄송합니다. 작동하지 않았으며 처음 듣지도 않았습니다. – user3621765

-1

어쩌면 당신의 play() 방법의 시작 부분에서하는 Clip를 얻기 전에 새로운 AudioInputStream 때마다 점점 시도? 방법의 시작이 줄을 추가 시도를 의미

:

audio = AudioSystem.getAudioInputStream(new File(PATH).getAbsoluteFile());

+0

클립의 전체 지점은 매번 사운드를로드 할 필요가 없습니다. 그것은 당신이 기억에서 그것을 재생하도록 만들어졌습니다. –

+0

@PhilFreihofner 나는 멜로디를 구성하고 그것을 연주하는 프로그램을 구현했다. 음표는 클립으로 연주되었습니다. 나는 같은 클립을 재사용하고 매번 (다시 말하자면) 리셋했다. 일관성이없고 정말로 나빴다. 누군가는 동일한 클립을 재사용하지 않고 매번 새로운 클립을 얻으라고 제안했습니다. 이제는 완벽하게 작동합니다 (예. 이상 함). 따라서 한번 시도해 볼 가치가 있습니다. –

+0

호기심. 짧은 파일은 긴 메모보다 훨씬 빨리 클립으로로드되므로 아마도 다른 요인이 관련되어있었습니다. 매번 새로운 항목을로드하는 경우 Clip보다 SourceDataLine을 사용하는 것이 좋습니다. 나는 당신의 결과를 이해하려고 노력하기 위해 더 많은 프로그램을 봐야 할 것입니다. 실시간 보안, 특히 여러 스레드에 걸쳐있을 때 Java는 상당히 다루기 힘들 수 있습니다. 그리고 Microsoft OS (시스템 클럭은 약 15 밀리 초까지만 정확합니다)가 더 심해집니다. 예를 들어, 버튼 클릭이나 마우스 움직임을 통해 소리를 발생시키는 것은 스레드를 교차하므로 잘 처리하기 어렵습니다. –

0

이 시도 : 당신의 클립 인스턴스 변수 만들기 (private 일). 클립을 초기화 할 때 열려있는 상태로 두십시오.

클립을 재생하는 방법은 다음 두 가지 작업 만 수행하십시오. (1) 프레임 위치 또는 마이크로 초 위치를 다시 0으로 이동하십시오. (2) 클립의 start() 메소드를 호출하십시오.

다시 초기화하지 마십시오. 닫지 마. 다시 열지 마십시오.

Clip의 사양을 보셨습니까? 오픈() 메소드에 관한 :

이미 열려있는 라인이 메소드를 호출은 불법 는 IllegalStateException가 발생할 수있다. 개방() 다음에 근처의 아이디어()에 관한

: 일부 라인은 한 번 닫힌 것을

참고, 다시 열 수 없습니다. 이러한 행을 다시 열려고하면 항상 LineUnavailableException이 발생합니다.

클립을 더 이상 호출하지 않을 것이라면 클립을 닫을 시간입니다.

자바 튜토리얼은 명확하게, 그러나 여기, 너무 자신의 링크의 수 : 이 http://docs.oracle.com/javase/tutorial/sound/playing.html

많은 사람들은 "좀"이 읽을 수 있어야합니다 (또는 그것을 읽고 이해되지 않음) 너무 많은 혼란 때문에 재생을 시작할 때마다 클립을 초기화하고여십시오. 이는 실제로 비효율적입니다. 전체 데이터 파일이 메모리에로드 될 때까지 재생이 시작되지 않아 불필요한 대기 시간이 추가됩니다.