最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)音頻文件播放功能

 更新時(shí)間:2018年12月19日 08:34:24   作者:mayifan_blog  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)音頻文件播放功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)音頻文件的播放功能的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)思路

1、首先獲取音頻文件的地址,然后通過(guò)IO流讀取音頻文件,加緩沖區(qū),實(shí)現(xiàn)Player類的對(duì)象。
2、Player類主要用于播放器的初始化,以及通過(guò)它來(lái)實(shí)現(xiàn)一些音視頻文件的播放,這個(gè)類需要手動(dòng)去網(wǎng)上下載,然后添加路徑到我們Eclipse的library中。
3、Player類有兩種方法比較常用,play()方法和close()方法,前者用于啟動(dòng)音頻文件,后者用于退出音頻文件的播放,這兩個(gè)方法我們?cè)谑褂玫臅r(shí)候需要注意,在整個(gè)音頻播放的過(guò)程中,程序都會(huì)停留在play()方法中,類似于在讀進(jìn)度條,close()方法可以使得其退出播放,程序往下繼續(xù)運(yùn)行。
4、假設(shè)我們點(diǎn)擊了開(kāi)始按鈕,那么程序就不會(huì)再去響應(yīng)你的停止操作了,于是,我們可以通過(guò)多線程來(lái)實(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è)開(kāi)關(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)和停止中我們看不出問(wèn)題,但是當(dāng)我們?cè)噲D關(guān)閉在run方法里循環(huán)中的音頻時(shí),我們會(huì)發(fā)現(xiàn)停止不了!為什么?我們把對(duì)象傳給線程類,close()方法依然可由此對(duì)象來(lái)執(zhí)行,當(dāng)他執(zhí)行完play()方法后,我們new一個(gè)新的對(duì)象時(shí),又開(kāi)辟了一塊新的內(nèi)存空間存放這個(gè)對(duì)象的數(shù)據(jù),再用原先的對(duì)象close()就不能到達(dá)效果了,即無(wú)法關(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、界面:

/**
* 背景音樂(lè)控制界面
*/
 public void showUI8(){ 
 JFrame jf8 =new JFrame("音樂(lè)");
 jf8.setSize(300, 150);
 jf8.setLocationRelativeTo(null);
 jf8.setDefaultCloseOperation(jf8.DISPOSE_ON_CLOSE);
 jf8.setLayout(null);
 jf8.setResizable(false);
 JLabel jl81 = new JLabel("選擇音樂(lè)");
 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)聽(tīng)器方法:

private Player player;
private Player player1;
public boolean loopFlag=false;

 public void actionPerformed(ActionEvent e)
 {
 if("音樂(lè)".equals(e.getActionCommand()))
 {
 System.out.println("音樂(lè)設(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("開(kāi)始播放:"+(String)jcb81.getSelectedItem());   
   MusicThread mt = new MusicThread(player, path ,listener);   
   mt.start();   
 }if("循環(huán)".equals(e.getActionCommand()))
 { 
 if(loopFlag==false)
 {
  System.out.println("打開(kāi)循環(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、界面效果圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java編程實(shí)現(xiàn)生成給定范圍內(nèi)不重復(fù)隨機(jī)數(shù)的方法小結(jié)

    Java編程實(shí)現(xiàn)生成給定范圍內(nèi)不重復(fù)隨機(jī)數(shù)的方法小結(jié)

    這篇文章主要介紹了Java編程實(shí)現(xiàn)生成給定范圍內(nèi)不重復(fù)隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式總結(jié)分析了java基于數(shù)學(xué)運(yùn)算與判斷實(shí)現(xiàn)不重復(fù)隨機(jī)數(shù)的生成功能,需要的朋友可以參考下
    2017-07-07
  • MyBatis中RowBounds實(shí)現(xiàn)內(nèi)存分頁(yè)

    MyBatis中RowBounds實(shí)現(xiàn)內(nèi)存分頁(yè)

    RowBounds是MyBatis提供的一種內(nèi)存分頁(yè)方式,適用于小數(shù)據(jù)量的分頁(yè)場(chǎng)景,本文就來(lái)詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • SWT(JFace) 簡(jiǎn)易瀏覽器 制作實(shí)現(xiàn)代碼

    SWT(JFace) 簡(jiǎn)易瀏覽器 制作實(shí)現(xiàn)代碼

    SWT(JFace) 簡(jiǎn)易瀏覽器 制作實(shí)現(xiàn)代碼
    2009-06-06
  • 一文教你掌握J(rèn)ava如何實(shí)現(xiàn)判空

    一文教你掌握J(rèn)ava如何實(shí)現(xiàn)判空

    實(shí)際項(xiàng)目中我們會(huì)有很多地方需要判空校驗(yàn),如果不做判空校驗(yàn)則可能產(chǎn)生NullPointerException異常。所以本文小編為大家整理了Java中幾個(gè)常見(jiàn)的判空方法,希望對(duì)大家有所幫助
    2023-04-04
  • Spring AOP入門Demo分享

    Spring AOP入門Demo分享

    這篇文章主要介紹了Spring AOP入門Demo分享,涉及創(chuàng)建maven項(xiàng)目,編寫切面類,通過(guò)bean配置關(guān)聯(lián)等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Linux下JDK安裝教程

    Linux下JDK安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下JDK安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • springboot中關(guān)于classpath:路徑使用及說(shuō)明

    springboot中關(guān)于classpath:路徑使用及說(shuō)明

    這篇文章主要介紹了springboot中關(guān)于classpath:路徑使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java poi導(dǎo)出Excel下載到客戶端

    Java poi導(dǎo)出Excel下載到客戶端

    這篇文章主要為大家詳細(xì)介紹了Java poi導(dǎo)出Excel下載到客戶端的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring中數(shù)據(jù)訪問(wèn)對(duì)象Data Access Object的介紹

    Spring中數(shù)據(jù)訪問(wèn)對(duì)象Data Access Object的介紹

    今天小編就為大家分享一篇關(guān)于Spring中數(shù)據(jù)訪問(wèn)對(duì)象Data Access Object的介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • java文件的簡(jiǎn)單讀寫操作方法實(shí)例分析

    java文件的簡(jiǎn)單讀寫操作方法實(shí)例分析

    這篇文章主要介紹了java文件的簡(jiǎn)單讀寫操作方法,結(jié)合實(shí)例形式分析了java文件流進(jìn)行讀寫操作的方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05

最新評(píng)論

永新县| 乐安县| 柯坪县| 舒城县| 赣州市| 南京市| 侯马市| 唐海县| 湟源县| 普宁市| 周口市| 法库县| 探索| 昌黎县| 皮山县| 隆昌县| 蕲春县| 洮南市| 宜良县| 武宁县| 杭锦旗| 谢通门县| 威远县| 赤城县| 海南省| 郯城县| 曲麻莱县| 禹城市| 江达县| 江西省| 新竹县| 绍兴市| 城口县| 二手房| 黄山市| 雷州市| 桑日县| 定襄县| 集贤县| 襄城县| 沅陵县|