2017-02-04 97 views
0

我想在调用方法getoutput时播放音乐,并在调用完成时停止播放音乐。我能够做到前者而不是后者。完成调用getoutput方法后,如何停止音乐?如何停止Java中的音频?

import java.io.InputStream; 
import javax.sound.sampled.AudioSystem; 

import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 

public class Student { 

    public void music() { 

     try { 
      // open the sound file as a Java input stream 
      String gongFile = "C:\\Users\\wei liang\\Documents\\Programming fundamentals\\T7-Arrays\\Assignment\\TT.wav"; 
      InputStream in = new FileInputStream(gongFile); 

      // create an audiostream from the inputstream 
      AudioStream audioStream = new AudioStream(in); 

      // play the audio clip with the audioplayer class 
      AudioPlayer.player.start(audioStream); 

     } catch (Exception ex) { 
      System.out.println("Error! Can't find file."); 
      ex.printStackTrace(); 
     } 
    } 
} 

这是我调用音乐方法和其他方法在Student类中未显示的主要方法。

public class StudentUser { 

    //Main method 
    public static void main(String args[]) { 

     //creating a new Student object 
     Student stud = new Student(); 

     //Calling the music method 
     stud.music(); 

     //Calling the getoutput method 
     stud.getoutput(); 

    } 
} 
+0

不要使用'太阳*'包,他们是无证和随时都可能消失。您应该使用'AudioInputStream'和'Clip'来存储/播放音频。 – Brendan

+0

如果你需要答案让我知道,我写信给你,你没有回应。 –

回答

0

我会建议使用线程,线程将保持直播,直到音乐文件播放,它会自动结束。

由于您没有提供getoutput方法,您只需拨打music方法即可播放音乐并结束播放。

Student类将是这样的:

import javax.sound.sampled.*; 
import java.io.File; 

class Student { 

    public synchronized void music(final String fileName, final SoundOptions mode) { 
     Thread music = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        AudioInputStream inputStream = AudioSystem.getAudioInputStream(
          new File(fileName)); 

        final Clip audioLineClip = (Clip) AudioSystem.getLine(
          new Line.Info(Clip.class)); 
        audioLineClip.open(inputStream); 
        audioLineClip.setFramePosition(0); 

        audioLineClip.addLineListener(new LineListener() { 
         @Override 
         public void update(LineEvent event) { 
          LineEvent.Type type = event.getType(); 
          if (type == LineEvent.Type.OPEN) { 
          } else if (type == LineEvent.Type.CLOSE) { 
           System.exit(0); 
          } else if (type == LineEvent.Type.START) { 
          } else if (type == LineEvent.Type.STOP) { 
           audioLineClip.close(); 
          } 
         } 
        }); 

        switch (mode) { 
         case Stop: 
          audioLineClip.stop(); 
          break; 
         case Play: 
          audioLineClip.start(); 
          break; 
         case Loop: 
          audioLineClip.loop(Clip.LOOP_CONTINUOUSLY); 
          break; 
        } 
       } catch (Exception e) { 
        System.err.println(e.getMessage()); 
       } 
      } 
     }); 

     if (mode != SoundOptions.Stop) { 
      music.start(); 

      synchronized (music) { 
       while (true) { 
        try { 
         music.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

     } else { 
      music.interrupt(); 
     } 
    } 


} 

enum SoundOptions { 
    Play, Loop, Stop 
} 

StudentUser类:

public class StudentUser { 

    private static String gongFile = "C:\\Users\\wei liang\\Documents\\Programming fundamentals\\T7-Arrays\\Assignment\\TT.wav"; 

    //Main method 
    public static void main(String args[]) { 

     //Creating a new Student object 
     Student stud = new Student(); 

     //Calling the music method and it is stops when music ends 
     stud.music(gongFile, SoundOptions.Play); 
    } 
}