更新時間:2019-09-16 09:56:08 來源:動力節點 瀏覽2644次
實現思路
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、界面:
/**
*背景音樂控制界面
*/
publicvoidshowUI8(){
JFramejf8=newJFrame("音樂");
jf8.setSize(300,150);
jf8.setLocationRelativeTo(null);
jf8.setDefaultCloseOperation(jf8.DISPOSE_ON_CLOSE);
jf8.setLayout(null);
jf8.setResizable(false);
JLabeljl81=newJLabel("選擇音樂");
jl81.setBounds(40,20,60,25);
jf8.add(jl81);
String[]str={"許嵩-斷橋殘雪.mp3","許嵩-有何不可.mp3","薛之謙-紳士.mp3","薛之謙-意外.mp3"};
JComboBox<String>jcb81=newJComboBox<String>(str);
jcb81.setBounds(120,20,150,25);
jf8.add(jcb81);
JButtonjbu81=newJButton("播放");
jbu81.setBounds(20,60,70,30);
jf8.add(jbu81);
jbu81.addActionListener(listener);
JButtonjbu82=newJButton("循環");
jbu82.setBounds(110,60,70,30);
jf8.add(jbu82);
jbu82.addActionListener(listener);
JButtonjbu83=newJButton("停止");
jbu83.setBounds(200,60,70,30);
jf8.add(jbu83);
jbu83.addActionListener(listener);
listener.setjcb81(jcb81);
jf8.setVisible(true);
}
2、監聽器方法:
privatePlayerplayer;
privatePlayerplayer1;
publicbooleanloopFlag=false;
publicvoidactionPerformed(ActionEvente)
{
if("音樂".equals(e.getActionCommand()))
{
System.out.println("音樂設置");
cli.showUI8();
}
if("播放".equals(e.getActionCommand()))
{
if(player!=null)
player.close();
loopFlag=false;
Stringpath="E:\\workspace\\mayifan\\chetRoom\\com\\myf\\client1207\\music\\"+(String)jcb81.getSelectedItem();
try{
Filefile=newFile(path);
FileInputStreamfis=newFileInputStream(file);
BufferedInputStreambuff=newBufferedInputStream(fis);
player=newPlayer(buff);
}catch(IOExceptione1){
e1.printStackTrace();
}catch(JavaLayerExceptione1){
e1.printStackTrace();
}
System.out.println("開始播放:"+(String)jcb81.getSelectedItem());
MusicThreadmt=newMusicThread(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、音頻線程:
publicclassMusicThreadextendsThread{
privatePlayerplayer;
privateStringpath;
privateListenerlistener;
privatePlayerplayer1;
publicMusicThread(Playerplayer,Stringpath,Listenerlistener){
this.player=player;
this.path=path;
this.listener=listener;
}
@Override
publicvoidrun(){
intadd=0;
try{
player.play();
}catch(JavaLayerExceptione){
e.printStackTrace();
}
player.close();
add++;
System.out.println(listener.loopFlag);
while(listener.loopFlag)
{
try{
Filefile1=newFile(path);
FileInputStreamfis1=newFileInputStream(file1);
BufferedInputStreambuff1=newBufferedInputStream(fis1);
player1=newPlayer(buff1);
listener.setplayer1(player1);
}catch(IOExceptione1){
e1.printStackTrace();
}catch(JavaLayerExceptione1){
e1.printStackTrace();
}
try{
player1.play();
}catch(JavaLayerExceptione1){
e1.printStackTrace();
}
add++;
}
System.out.println("循環播放次數:"+add);
}
}
4、界面效果圖:
以上就是動力節點java培訓機構小編介紹的“用Java實現音頻文件的播放”的內容,希望對大家有幫助,更多java最新資訊請繼續關注動力節點java培訓機構官網,每天會有精彩內容分享與你。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習