虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Java编程 > 使用javax.sound实现简单音频播放

使用javax.sound实现简单音频播放
类别:Java编程   作者:码皇   来源:互联网   点击:

这篇文章主要为大家详细介绍了使用javax sound实现简单音频播放,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了javax.sound实现简单音频播放的具体代码,供大家参考,具体内容如下

    /** * @see * @author Al_assad yulinying_1994@outlook.com * @date 2016年11月17日 下午6:27:59 * @version V1.0 * Description: 简易音频播放器(只支持AU,RA,WAV) * 在不使用JMF的情况下快速实现音频播放 * */ import javax.sound.sampled.*;
    import java.io.*;
    public class MusicPlayer {
    private String musicPath;
    //音频文件 private volatile boolean run = true;
    //记录音频是否播放 private Thread mainThread;
    //播放音频的任务线程 private AudioInputStream audioStream;
    private AudioFormat audioFormat;
    private SourceDataLine sourceDataLine;
    public MusicPlayer(String musicPath) {
    this.musicPath = musicPath;
    prefetch();
    }
    //数据准备 private void prefetch(){
    try{
    //获取音频输入流 audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
    //获取音频的编码对象 audioFormat = audioStream.getFormat();
    //包装音频信息 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED);
    //使用包装音频信息后的Info类创建源数据行,充当混频器的源 sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);
    sourceDataLine.open(audioFormat);
    sourceDataLine.start();
    }
    catch(UnsupportedAudioFileException ex){
    ex.printStackTrace();
    }
    catch(LineUnavailableException ex){
    ex.printStackTrace();
    }
    catch(IOException ex){
    ex.printStackTrace();
    }
    }
    //析构函数:关闭音频读取流和数据行 protected void finalize() throws Throwable{
    super.finalize();
    sourceDataLine.drain();
    sourceDataLine.close();
    audioStream.close();
    }
    //播放音频:通过loop参数设置是否循环播放 private void playMusic(boolean loop)throws InterruptedException {
    try{
    if(loop){
    while(true){
    playMusic();
    }
    }
    else{
    playMusic();
    //清空数据行并关闭 sourceDataLine.drain();
    sourceDataLine.close();
    audioStream.close();
    }
    }
    catch(IOException ex){
    ex.printStackTrace();
    }
    }
    private void playMusic(){
    try{
    synchronized(this){
    run = true;
    }
    //通过数据行读取音频数据流,发送到混音器;
    //数据流传输过程:AudioInputStream -> SourceDataLine;
    audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
    int count;
    byte tempBuff[] = new byte[1024];
    while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){
    synchronized(this){
    while(!run) wait();
    }
    sourceDataLine.write(tempBuff,0,count);
    }
    }
    catch(UnsupportedAudioFileException ex){
    ex.printStackTrace();
    }
    catch(IOException ex){
    ex.printStackTrace();
    }
    catch(InterruptedException ex){
    ex.printStackTrace();
    }
    }
    //暂停播放音频 private void stopMusic(){
    synchronized(this){
    run = false;
    notifyAll();
    }
    }
    //继续播放音乐 private void continueMusic(){
    synchronized(this){
    run = true;
    notifyAll();
    }
    }
    //外部调用控制方法:生成音频主线程; public void start(boolean loop){
    mainThread = new Thread(new Runnable(){
    public void run(){
    try {
    playMusic(loop);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    );
    mainThread.start();
    }
    //外部调用控制方法:暂停音频线程 public void stop(){
    new Thread(new Runnable(){
    public void run(){
    stopMusic();
    }
    }
    ).start();
    }
    //外部调用控制方法:继续音频线程 public void continues(){
    new Thread(new Runnable(){
    public void run(){
    continueMusic();
    }
    }
    ).start();
    }
    //Test public static void main(String[] args) throws InterruptedException{
    MusicPlayer player = new MusicPlayer("bgm/1.wav");
    //创建音乐播放器 player.start(true);
    //以开始以循环的形式播放,player(false)为不循环播放 TimeUnit.SECONDS.sleep(5);
    player.stop();
    //暂停播放音频 TimeUnit.SECONDS.sleep(4);
    player.continues();
    //继续开始播放音频 }
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • 代码分析JAVA中PCM人声音频变声处理
  • Java使用IO流实现音频的剪切和拼接
  • 实例解析使用Java实现基本的音频播放器的编写要点
  • java音频播放示例分享(java如何播放音频)
相关热词搜索: javax sound 音频播放