本文實(shí)例為大家分享了java實(shí)現(xiàn)音頻文件的播放功能的具體代碼,供大家參考,具體內(nèi)容如下
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、淥口網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為淥口等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
實(shí)現(xiàn)思路
1、首先獲取音頻文件的地址,然后通過IO流讀取音頻文件,加緩沖區(qū),實(shí)現(xiàn)Player類的對(duì)象。
2、Player類主要用于播放器的初始化,以及通過它來實(shí)現(xiàn)一些音視頻文件的播放,這個(gè)類需要手動(dòng)去網(wǎng)上下載,然后添加路徑到我們Eclipse的library中。
3、Player類有兩種方法比較常用,play()方法和close()方法,前者用于啟動(dòng)音頻文件,后者用于退出音頻文件的播放,這兩個(gè)方法我們?cè)谑褂玫臅r(shí)候需要注意,在整個(gè)音頻播放的過程中,程序都會(huì)停留在play()方法中,類似于在讀進(jìn)度條,close()方法可以使得其退出播放,程序往下繼續(xù)運(yùn)行。
4、假設(shè)我們點(diǎn)擊了開始按鈕,那么程序就不會(huì)再去響應(yīng)你的停止操作了,于是,我們可以通過多線程來實(shí)現(xiàn)這個(gè)啟動(dòng)和停止功能,讓播放在一個(gè)線程里自己去執(zhí)行。
5、那么循環(huán)呢?如何實(shí)現(xiàn)循環(huán)播放?答案是while循環(huán),我們需要一個(gè)參數(shù)作為while的循環(huán)條件,類似于一個(gè)開關(guān),只要為true,就一直循環(huán)播放。
6、我們?cè)趫?zhí)行完一次播放后就不能再次對(duì)這個(gè)對(duì)象調(diào)用play()方法了,我們需要再次創(chuàng)建新的對(duì)象,那么我們要想關(guān)閉新的對(duì)象就必須讓執(zhí)行close()方法的對(duì)象是這個(gè)新的對(duì)象,我們每次新建相同名稱的對(duì)象,player.close()執(zhí)行后關(guān)閉的往往只能是最后的那個(gè)對(duì)象。在啟動(dòng)和停止中我們看不出問題,但是當(dāng)我們?cè)噲D關(guān)閉在run方法里循環(huán)中的音頻時(shí),我們會(huì)發(fā)現(xiàn)停止不了!為什么?我們把對(duì)象傳給線程類,close()方法依然可由此對(duì)象來執(zhí)行,當(dāng)他執(zhí)行完play()方法后,我們new一個(gè)新的對(duì)象時(shí),又開辟了一塊新的內(nèi)存空間存放這個(gè)對(duì)象的數(shù)據(jù),再用原先的對(duì)象close()就不能到達(dá)效果了,即無法關(guān)閉這個(gè)音頻。解決辦法:在每次new新對(duì)象后用set方法把對(duì)象傳回去,我們可以理解為讓close方法的調(diào)用者一直是這個(gè)新new的對(duì)象。
7、到這里就不得不提一下static了,一般我們不斷用相同的對(duì)象名去new同類的對(duì)象時(shí),它們是共享代碼(JVM中),但是它們的對(duì)象數(shù)據(jù)都是獨(dú)立的,內(nèi)存空間也是不同的;如果加了static,方法或者屬性就會(huì)屬于這個(gè)類,那么它們就變成唯一的了,對(duì)象共用被static修飾的代碼和屬性。
代碼實(shí)現(xiàn)
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("循環(huán)"); 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、監(jiān)聽器方法:
private Player player; private Player player1; public boolean loopFlag=false; public void actionPerformed(ActionEvent e) { if("音樂".equals(e.getActionCommand())) { System.out.println("音樂設(shè)置"); 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("循環(huán)".equals(e.getActionCommand())) { if(loopFlag==false) { System.out.println("打開循環(huán)播放"); loopFlag = true; }else{ System.out.println("關(guān)閉循環(huán)播放"); 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("循環(huán)播放次數(shù):"+add); } }
4、界面效果圖:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
分享標(biāo)題:java實(shí)現(xiàn)音頻文件播放功能
標(biāo)題來源:http://www.rwnh.cn/article0/ipcjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、App設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、網(wǎng)站改版、動(dòng)態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)