2013-06-16 3 views
0

Ну, в названии написано все, я пробовал играть в wav-файл, используя javax.sound, и ничего не происходит. Я пробовал много разных файлов без везения.Клип не воспроизводит звук

public static void main(String[] args) throws IOException, UnsupportedAudioFileException, LineUnavailableException 
{ 

    File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav"); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
    Clip play = AudioSystem.getClip(); 
    play.open(audioInputStream); 
    FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); 
    volume.setValue(1.0f); // Reduce volume by 10 decibels. 
    play.start(); 

} 
+1

Вы получаете какие-либо ошибки или просто ничего не происходит? – sirFunkenstine

+2

для рабочих примеров посмотрите http://stackoverflow.com/tags/javasound/info – Pshemo

ответ

4

звук в Java Clip требует активного Thread для воспроизведения файла аудио входа в противном случае приложение закрывается до того, как файл может быть воспроизведен. Вы можете добавить

JOptionPane.showMessageDialog(null, "Click OK to stop music"); 

после звонка start.

+0

downvoter - прокомментировать? – Reimeus

+0

'Clip' является' DataLine' и как таковой, 'start()' не блокирует. Однако в интерфейсе явно указано, что метод 'drain()' _is_ blocking: _ "Этот метод блокируется до завершения слива." _ Из [DataLine.drain()] (http://docs.oracle.com /javase/7/docs/api/javax/sound/sampled/DataLine.html#drain()). Любое решение, требующее искусственного отключения программы от выхода, неверно. Это явно объяснено в [Учебном пособии по воспроизведению Java] (http://docs.oracle.com/javase/tutorial/sound/playing.html). – Jared

0

Ваша программа заканчивается перед тем, как звук будет воспроизводиться. Я бы сделал play.start(); в некотором поточном способе (invokeLater, ...), а также нашел способ подождать, пока звук не закончится (предложил Реймеус).

свинцовый:

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      ... 

      play.start(); 
      JOptionPane.showMessageDialog(null, "Click OK to stop music"); 
     } 
    }); 

} 
2

Здесь playing a clip

public static void main(String[] args) throws Exception { 
      File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav"); 
      AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
      Clip play = AudioSystem.getClip(); 
      play.open(audioInputStream); 
      FloatControl volume= (FloatControl)play.getControl(FloatControl.Type.MASTER_GAIN); 
      volume.setValue(1.0f); // Reduce volume by 10 decibels. 
      play.start(); 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        // A GUI element to prevent the Clip's daemon Thread 
        // from terminating at the end of the main() 
        JOptionPane.showMessageDialog(null, "Close to exit!"); 
       } 
      }); 
     } 
7

Как, уже начинают заявил, что вам нужно, чтобы предотвратить основной поток от выхода, так как это приведет к JVM прекратить.

Clip#start не является блокирующим вызовом, что означает, что он вернется (вскоре) после его вызова.

У меня нет сомнений в том, что есть много способов подойти к этой проблеме, и это простой пример одного из них.

public class PlayMusic { 

    public static void main(String[] args) throws InterruptedException { 
     Clip play = null; 
     try { 
      File in = new File("C:\\Users\\Public\\Music\\Sample Music\\Kalimba.wav"); 
      AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
      play = AudioSystem.getClip(); 
      play.open(audioInputStream); 
      FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); 
      volume.setValue(1.0f); // Reduce volume by 10 decibels. 
      play.start(); 
      // Loop until the Clip is not longer running. 
      // We loop this way to allow the line to fill, otherwise isRunning will 
      // return false 
      //do { 
      // Thread.sleep(15); 
      //} while (play.isRunning()); 
      play.drain(); 
     } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) { 
      ex.printStackTrace(); 
     } finally { 
      try { 
       play.close(); 
      } catch (Exception exp) { 
      } 
     } 
     System.out.println("..."); 
    } 
} 

Реальное решение будет зависеть от ваших потребностей.

+0

Вы должны оценить слепое downvoting без простой cortesrty, чтобы объяснить, почему, поэтому мы все можем узнать, что лучше даст ответ – MadProgrammer

+1

i will upvote you xD для необъяснимого downvote – nachokk

+1

@MadProgrammer 'Clip' является' DataLine' и как такой, 'start()' не блокируется. Однако в интерфейсе явно указано, что метод 'drain()' _is_ blocking: _ "Этот метод блокируется до завершения слива." _ Из [DataLine.drain()] (http://docs.oracle.com /javase/7/docs/api/javax/sound/sampled/DataLine.html#drain()). Любое решение, требующее искусственного отключения программы от выхода, неверно. Это явно объяснено в [Учебном пособии по воспроизведению Java] (http://docs.oracle.com/javase/tutorial/sound/playing.html). – Jared

3

Правильный способ воспроизведения аудиоклипа состоит в том, чтобы слить линию, как описано в Playing Back Audio.

Так ваш главный должен выглядеть следующим образом:

public static void main(String[] args) throws IOException, 
    UnsupportedAudioFileException, LineUnavailableException 
{ 
    File in = new File("C:\\Users\\Sandra\\Desktop\\music\\rags.wav"); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(in); 
    Clip play = AudioSystem.getClip(); 
    play.open(audioInputStream); 
    FloatControl volume= (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); 
    volume.setValue(1.0f); // Reduce volume by 10 decibels. 
    play.start(); 
    play.drain(); 
    play.close(); 
} 

play.drain() блоки до тех пор, пока играется все данные.

Смежные вопросы