2012-11-24 3 views
0

인터넷을 통해 wav 파일을 재생하는 방법을 살펴 보았습니다.하지만 별도의 스레드에서 재생되지 않기 때문에 노래가 끝날 때까지 프로그램이 중단되고 게임에서는 작동하지 않습니다. 그러나 별도의 스레드에서 모든 것을 재생하려고하면 지연됩니다. 누구든지이 문제를 해결할 수 있습니까?지연없이 wav 파일을 재생하는 방법은 무엇입니까?

참고 : 나는 또한 지속적으로 배경에 그림입니다 :

public class DrawThread extends Thread { 

    JFrame j; 

    public DrawThread(JFrame frame) { 
     j = frame; 
    } 

    public void run() { 
     while (!(isInterrupted())) { 
      if (j.isDisplayable() && j.isActive() && j.isEnabled()) 
      j.update(j.getGraphics()); 
     } 
    } 

} 

하고 업데이트하는 것은 그냥 페인트를 호출

public void paint(Graphics g) { 
      Graphics2D bg = (Graphics2D) g; 
    bg.setBackground(Color.black); 
    int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); 
    int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); 
    if (time < 500) { 
     x[time] = r.nextInt(w) + 150; 
     y[time] = h; 
     z[time] = r.nextInt(w) + 150; 
     time++; 
    } 
    for (int i = 0; i < time; i++) { 
     y[i] -= forward; 
     x[i] -= right; 
     if (y[i] < 1) { 
      x[i] = r.nextInt(400) - 200; 
      y[i] = 300; 
      z[i] = r.nextInt(400) - 200; 
     } else if (y[i] > 300) { 
      x[i] = r.nextInt(400) - 200; 
      y[i] = 1; 
      z[i] = r.nextInt(400) - 200; 
     } 
     if (x[i] > 200) 
      x[i] = -200; 
     else if (x[i] < -200) 
      x[i] = 200; 
     bg.setColor(color); 
     bg.drawLine(
       getWidth()/2 + (int) Math.round(x[i] * 200/y[i]), 
       getHeight()/2 + (int) Math.round(z[i] * 200/y[i]), 
       getWidth() 
         /2 
         + (int) Math.round((x[i] + right) * 200 
           /Math.abs(y[i] + forward)), 
       getHeight() 
         /2 
         + (int) Math.round((z[i]) * 200 
           /Math.abs(y[i] + forward))); 
    } 
} 

편집 : 내가 사용 음악 플레이어 클래스 (추가 나는) BigClip로 전환했습니다 당신은 코드를 표시하지 않은

import java.io.File; 
import java.util.Collection; 
import java.util.HashMap; 

import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 

import org.crystalix.util.SoundListener; 

public class MSHandler { 
public static boolean pause = false; 
public static boolean stop = false; 
private static HashMap<String, BigClip> clips = new HashMap<String, BigClip>(); 

public static void stopAll() { 
    Collection<BigClip> c = clips.values(); 
    for (BigClip b : c) { 
     System.out.println("Stopping "+b.toString()); 
     b.stop(); 
     System.out.println("Stopped "+b.toString()); 
    } 
} 

public static void playMusic(File file) { 
    try { 
     AudioInputStream audioIn = AudioSystem.getAudioInputStream(file); 
     BigClip clip = new BigClip(); 
     clip.open(audioIn); 
     clip.addLineListener(new SoundListener()); 
     clip.loop(1); 
     clip.start(); 
     clips.put(file.getName(), clip); 
    } catch (Exception e) { 
     System.err.println("Sound could not be started!"); 
     e.printStackTrace(System.err); 
    } 
} 
} 
+0

1)'j.update (j.getGraphics());'하지 마세요. 다른 많은 문제를 일으킬 가능성이 있습니다. 2) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 3) [Java Sound tag Wiki] (http://stackoverflow.com/tags/javasound/info)에서 볼 수 있듯이 소리에 'Clip'을 사용하십시오. –

+0

가능한 한 자주 페인트하려고하는 것이 어떻습니까? 그것은 그것이 반복적으로 페인트하게 만드는 유일한 방법입니다. 기본적으로 그렇게하지 않습니다. 또한 파일은 음악이 아니기 때문에 소리가 나지 않으므로 클립이 너무 크기 때문에 제대로 작동하지 않습니다. 실제로 Clip을 사용했는데 실패했습니다. –

+0

* "가능한 한 자주 페인트하려고하는 것이 어떻습니까?"* 비디오 카드와 직접 인터페이스하는 언어를 사용하십시오. * ".. 너무 큽니다. 실제로 클립을 사용했지만 실패했습니다"*이 경우에는 ['BigClip'] (http://stackoverflow.com/a/5668510/418556)을 사용하십시오. –

답변

0

당신은 WAV 파일 playbac에 사용하는 케이. 그것은 잘못 될 수있는 것을 진단하기가 약간 어렵습니다!

1) wav는 단순히 자체 스레드에 있어야합니다. 그렇게하면 올바르게 차단되지 않습니다. 자바 사운드 튜토리얼은 이것을 지적하는 데 특히 도움이되지 않습니다. 그래서 : 자신의 runnable에서 wav 재생을 호출하는 코드를 넣어 당신은 괜찮을 것입니다.

2) 재생하기 전에 wav를 "열 수"있습니다. 그런 다음 마침내 말해야 할 때 즉시 "시작"해야합니다.

다른 메모 : 이미 메모리에있는 경우 wav 파일을 재생하는 코드가 더 빨리 실행됩니다. 그래서, 때로는 첫 번째 웨이브 재생은 약간의 주저 후에 시작됩니다. 그러나 사운드 재생 코드를 메모리에 저장하기 위해 제로 볼륨에서 다른 사운드를 재생하여이 문제를 해결할 수 있습니다. 사운드가있는 프로그램을 시작할 때 종종 이렇게합니다.

백그라운드에서 연속 페인팅은 많은 CPU를 사용하여 JVM이 사운드를 처리 할 시간이 없다면 문제가 될 수 있습니다. 그게 문제라면 정말 놀라실 것입니다. 만약 그렇다면, 아마도 당신이 들었을 것입니다 그것의 많은 클릭과 사운드 재생입니다.

+0

질문에 wav 파일을 재생하는 코드를 넣습니다. 내가 경험하는 문제는 소리가 끊어져서 어떤 점에서 뛰어 오르고 나서 부드럽게 나오고 다시 뛰기 시작한다는 것입니다. –

+0

잘라 내기 및 잘라내 기는 일반적으로 오디오 데이터를 출력 라인에 빠르게 전달하지 않아서 재생을 따라갈 수없는 결과를 초래합니다. 큰 RAM이 필요한 BigClip이 아니라 wav 파일에 SourceDataLine을 사용해보십시오. 어쩌면 BigClip을 잘못된 상황에서 사용하면 페이지 스와핑이 시작될 수 있습니까? 또한 자체 스레드에 재생을 넣으십시오. 나는 당신이 아직 그 일을하는 곳을 보지 못했다.사운드를 자체적으로 실행하여 올바르게 설정했는지 확인한 다음 그래픽을 추가하고 고장이 나는 시점을 확인합니다. 당신의 도표는 동시 소리를 허용하기 위하여 단순히 너무 많은 cpu를 소모하고 있을지도 모른다. –

+0

앤드류의 빅 클립인가? 그 경우, SourceDataLine를 사용해 새로운 Thread를 시작합니다. –

관련 문제