使用javax.sound怎么實(shí)現(xiàn)音頻播放功能

使用javax.sound怎么實(shí)現(xiàn)音頻播放功能?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括成都做網(wǎng)站、網(wǎng)站建設(shè)、app軟件定制開(kāi)發(fā)重慶小程序開(kāi)發(fā)、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營(yíng)銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。 

具體內(nèi)容如下

import javax.sound.sampled.*; 
import java.io.*; 
 
public class MusicPlayer { 
  private String musicPath; //音頻文件 
  private volatile boolean run = true; //記錄音頻是否播放 
  private Thread mainThread;  //播放音頻的任務(wù)線程 
   
  private AudioInputStream audioStream; 
  private AudioFormat audioFormat; 
  private SourceDataLine sourceDataLine; 
   
  public MusicPlayer(String musicPath) { 
    this.musicPath = musicPath; 
    prefetch(); 
  } 
   
  //數(shù)據(jù)準(zhǔn)備 
  private void prefetch(){ 
    try{ 
    //獲取音頻輸入流 
    audioStream = AudioSystem.getAudioInputStream(new File(musicPath)); 
    //獲取音頻的編碼對(duì)象 
    audioFormat = audioStream.getFormat(); 
    //包裝音頻信息 
    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, 
        audioFormat,AudioSystem.NOT_SPECIFIED); 
    //使用包裝音頻信息后的Info類創(chuàng)建源數(shù)據(jù)行,充當(dāng)混頻器的源 
    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(); 
    } 
     
  } 
  //析構(gòu)函數(shù):關(guān)閉音頻讀取流和數(shù)據(jù)行 
  protected void finalize() throws Throwable{ 
    super.finalize(); 
    sourceDataLine.drain(); 
    sourceDataLine.close(); 
    audioStream.close(); 
  } 
   
  //播放音頻:通過(guò)loop參數(shù)設(shè)置是否循環(huán)播放 
  private void playMusic(boolean loop)throws InterruptedException { 
    try{ 
        if(loop){ 
          while(true){ 
            playMusic(); 
          } 
        }else{ 
          playMusic(); 
          //清空數(shù)據(jù)行并關(guān)閉 
          sourceDataLine.drain(); 
          sourceDataLine.close(); 
          audioStream.close(); 
        } 
       
    }catch(IOException ex){ 
      ex.printStackTrace(); 
    } 
     
     
  } 
  private void playMusic(){ 
    try{ 
      synchronized(this){ 
        run = true; 
      } 
      //通過(guò)數(shù)據(jù)行讀取音頻數(shù)據(jù)流,發(fā)送到混音器; 
      //數(shù)據(jù)流傳輸過(guò)程: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(); 
    } 
  } 
  //繼續(xù)播放音樂(lè) 
  private void continueMusic(){ 
    synchronized(this){ 
       run = true; 
       notifyAll(); 
    } 
  } 
   
   
  //外部調(diào)用控制方法:生成音頻主線程; 
  public void start(boolean loop){ 
    mainThread = new Thread(new Runnable(){ 
      public void run(){ 
        try { 
          playMusic(loop); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 
    }); 
    mainThread.start(); 
  } 
   
  //外部調(diào)用控制方法:暫停音頻線程 
  public void stop(){ 
    new Thread(new Runnable(){ 
      public void run(){ 
        stopMusic(); 
         
      } 
    }).start(); 
  } 
  //外部調(diào)用控制方法:繼續(xù)音頻線程 
  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");  //創(chuàng)建音樂(lè)播放器 
     
    player.start(true);  //以開(kāi)始以循環(huán)的形式播放,player(false)為不循環(huán)播放 
     
    TimeUnit.SECONDS.sleep(5); 
     
    player.stop();  //暫停播放音頻 
     
    TimeUnit.SECONDS.sleep(4); 
     
    player.continues();  //繼續(xù)開(kāi)始播放音頻 
     
  } 
 
 }

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)站名稱:使用javax.sound怎么實(shí)現(xiàn)音頻播放功能
轉(zhuǎn)載來(lái)于:http://www.muchs.cn/article2/gcegoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)標(biāo)簽優(yōu)化、網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)