您好,登錄后才能下訂單哦!
本文實例為大家分享了java實現音頻文件的播放功能的具體代碼,供大家參考,具體內容如下
實現思路
1、首先獲取音頻文件的地址,然后通過IO流讀取音頻文件,加緩沖區,實現Player類的對象。
2、Player類主要用于播放器的初始化,以及通過它來實現一些音視頻文件的播放,這個類需要手動去網上下載,然后添加路徑到我們Eclipse的library中。
3、Player類有兩種方法比較常用,play()方法和close()方法,前者用于啟動音頻文件,后者用于退出音頻文件的播放,這兩個方法我們在使用的時候需要注意,在整個音頻播放的過程中,程序都會停留在play()方法中,類似于在讀進度條,close()方法可以使得其退出播放,程序往下繼續運行。
4、假設我們點擊了開始按鈕,那么程序就不會再去響應你的停止操作了,于是,我們可以通過多線程來實現這個啟動和停止功能,讓播放在一個線程里自己去執行。
5、那么循環呢?如何實現循環播放?答案是while循環,我們需要一個參數作為while的循環條件,類似于一個開關,只要為true,就一直循環播放。
6、我們在執行完一次播放后就不能再次對這個對象調用play()方法了,我們需要再次創建新的對象,那么我們要想關閉新的對象就必須讓執行close()方法的對象是這個新的對象,我們每次新建相同名稱的對象,player.close()執行后關閉的往往只能是最后的那個對象。在啟動和停止中我們看不出問題,但是當我們試圖關閉在run方法里循環中的音頻時,我們會發現停止不了!為什么?我們把對象傳給線程類,close()方法依然可由此對象來執行,當他執行完play()方法后,我們new一個新的對象時,又開辟了一塊新的內存空間存放這個對象的數據,再用原先的對象close()就不能到達效果了,即無法關閉這個音頻。解決辦法:在每次new新對象后用set方法把對象傳回去,我們可以理解為讓close方法的調用者一直是這個新new的對象。
7、到這里就不得不提一下static了,一般我們不斷用相同的對象名去new同類的對象時,它們是共享代碼(JVM中),但是它們的對象數據都是獨立的,內存空間也是不同的;如果加了static,方法或者屬性就會屬于這個類,那么它們就變成唯一的了,對象共用被static修飾的代碼和屬性。
代碼實現
1、界面:
/** * 背景音樂控制界面 */ public void showUI8(){ JFrame jf8 =new JFrame("音樂"); jf8.setSize(300, 150); jf8.setLocationRelativeTo(null); jf8.setDefaultCloseOperation(jf8.DISPOSE_ON_CLOSE); jf8.setLayout(null); jf8.setResizable(false); JLabel jl81 = new JLabel("選擇音樂"); jl81.setBounds(40,20,60,25); jf8.add(jl81); String[] str = {"許嵩 - 斷橋殘雪.mp3","許嵩 - 有何不可.mp3","薛之謙 - 紳士.mp3","薛之謙 - 意外.mp3"}; JComboBox<String> jcb81 = new JComboBox<String>(str); jcb81.setBounds(120, 20, 150, 25); jf8.add(jcb81); JButton jbu81=new JButton("播放"); jbu81.setBounds(20,60,70,30); jf8.add(jbu81); jbu81.addActionListener(listener); JButton jbu82=new JButton("循環"); jbu82.setBounds(110,60,70,30); jf8.add(jbu82); jbu82.addActionListener(listener); JButton jbu83=new JButton("停止"); jbu83.setBounds(200,60,70,30); jf8.add(jbu83); jbu83.addActionListener(listener); listener.setjcb81(jcb81); jf8.setVisible(true); }
2、監聽器方法:
private Player player; private Player player1; public boolean loopFlag=false; public void actionPerformed(ActionEvent e) { if("音樂".equals(e.getActionCommand())) { System.out.println("音樂設置"); cli.showUI8(); } if("播放".equals(e.getActionCommand())) { if(player!=null) player.close(); loopFlag=false; String path = "E:\\workspace\\mayifan\\chetRoom\\com\\myf\\client1207\\music\\"+(String)jcb81.getSelectedItem(); try{ File file = new File(path); FileInputStream fis = new FileInputStream(file); BufferedInputStream buff = new BufferedInputStream(fis); player = new Player(buff); }catch(IOException e1){ e1.printStackTrace(); }catch(JavaLayerException e1){ e1.printStackTrace(); } System.out.println("開始播放:"+(String)jcb81.getSelectedItem()); MusicThread mt = new MusicThread(player, path ,listener); mt.start(); }if("循環".equals(e.getActionCommand())) { if(loopFlag==false) { System.out.println("打開循環播放"); loopFlag = true; }else{ System.out.println("關閉循環播放"); loopFlag = true; } } if("停止".equals(e.getActionCommand())) { System.out.println("停止播放"); loopFlag=false; player.close(); player1.close(); } }
3、音頻線程:
public class MusicThread extends Thread{ private Player player; private String path; private Listener listener; private Player player1; public MusicThread(Player player , String path , Listener listener){ this.player=player; this.path = path; this.listener=listener; } @Override public void run() { int add=0; try{ player.play(); }catch(JavaLayerException e){ e.printStackTrace(); } player.close(); add++; System.out.println(listener.loopFlag); while(listener.loopFlag) { try{ File file1 = new File(path); FileInputStream fis1 = new FileInputStream(file1); BufferedInputStream buff1 = new BufferedInputStream(fis1); player1 = new Player(buff1); listener.setplayer1(player1); }catch(IOException e1){ e1.printStackTrace(); }catch(JavaLayerException e1){ e1.printStackTrace(); } try{ player1.play(); }catch(JavaLayerException e1){ e1.printStackTrace(); } add++; } System.out.println("循環播放次數:"+add); } }
4、界面效果圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。