在写Java程序的时候常常需要播放背景音乐,其实实现只需两步即可。

1.首先需要下载一个jar包

最近有许多网友反应说原来的下载地址不能用了,这里提供一个最新下载地址:jlayer-1.0.1.jar,下载完成直接导入jar即可,亲测可用。

网址:http://www.javazoom.net/javalayer/javalayer.html

下载完成,解压后找到如图所示的包导入到项目中去。

2.然后, 只需将下面的几行代码粘入程序中即可,即粘即用,如果出现错误多半是jar包没有正确导入。

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.*; class Play0 extends Thread{Player player;String music;public Play0(String file) {this.music = file;}public void run() {try {play();     } catch (FileNotFoundException | JavaLayerException e) {e.printStackTrace();}}public void play() throws FileNotFoundException, JavaLayerException { BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(music)); player = new Player(buffer); player.play(); }
} 

上面的代码实则是将播放程序放入线程中去,然后再在需要播放音乐的地方写入如下代码,开启线程。

new Play0("C:\\Users\\ds_surk\\Desktop\\My soul.mp3").start();

如需结束播放则需要这样写。

Play0 play0 = new Play0("C:\\Users\\ds_surk\\Desktop\\My soul.mp3");play0.start();  //开启play0.stop();   //结束

如果看不懂,直接粘即可,只需将 "C:\\Users\\ds_surk\\Desktop\\My soul.mp3" 替换成自己想要播放的音乐即可,格式为MP3。

后记:

由于原有代码过期,现根据已有的问题,特作统一回复。

1.Java多线程的stop方法过期,如何停止播放?

直接放代码吧,简单粗暴。

public class Music {public static void main(String[] args) {String file = "C:\\Users\\surk\\Desktop\\1.mp3";Play play = new Play(file);Player player = play.getPlayer();// 开启play.start();try {Thread.sleep(2000);// 输出当前播放的位置(时间)System.out.println(player.getPosition());Thread.sleep(4000);} catch (InterruptedException e) {e.printStackTrace();}// 输出是否播放完毕System.out.println(player.isComplete());//结束play.stop();}}class Play implements Runnable {private Player player = null;private Thread thread = null;public Play(String file) {try {player = new Player(new FileInputStream(file));} catch (JavaLayerException | FileNotFoundException e) {e.printStackTrace();}}public void run() {try {player.play();} catch (JavaLayerException ex) {System.err.println("Problem playing audio: " + ex);}}public void start() {thread = new Thread(this, "Player thread");thread.start();}public void stop() {player.close();thread = null;}public Player getPlayer() {return player;}}

2.如何暂停?

首先现有的Player类是没有提供暂停方法的,所以想要暂停播放,需要一些技巧。

Player只提供了播放和停止方法,然后还有一个AdvancedPlayer类,它提供的方法会多些,

于是根据AdvancedPlayer类有如下代码,来实现暂停播放。

public class Music {public static void main(String[] args) {String file = "C:\\Users\\surk\\Desktop\\1.mp3";Play play = new Play(file);// 开启play.start();try {Thread.sleep(5000);// 暂停play.stop();Thread.sleep(2000);// 重新播放play.start();} catch (InterruptedException e) {e.printStackTrace();}//结束play.stop();System.out.println("stop!");}}class Play implements Runnable {private final String file;private AdvancedPlayer player = null;private Thread thread = null;public int pauseFrame = 0;public Play(String file) {this.file = file;}public void run() {// 每次开始需要重新创建AdvancedPlayer,否则会报错createPlayer();play();}public void start() {thread = new Thread(this, "Player thread");thread.start();}public void stop() {player.stop();thread = null;}protected void play() {try {player.play(pauseFrame, Integer.MAX_VALUE);} catch (JavaLayerException ex) {System.err.println("Problem playing audio: " + ex);}}protected void createPlayer() {try {player = new AdvancedPlayer(new FileInputStream(file));// 这里设置一个监听器,来监听停止事件,记录停止帧player.setPlayBackListener(new PlaybackListener() {@Overridepublic void playbackFinished(PlaybackEvent event) {pauseFrame = event.getFrame();}});} catch (JavaLayerException | IOException e) {e.printStackTrace();}}
}

大致思路是通过监听停止事件来记录停止时的帧,然后从停止帧继续播放。这样重新播放时就可以从上次暂停的地方继续。但是,这里有坑!!!我发现,无论是event.getFrame()还是Player类的player.getPosition()方法均不能正确的获取帧!

所以你会发现,当重新播放时,它播放的点并不是上次暂停的地方!!

不过,总归思路是行的通的!只要正确的找到帧,就可以成功实现暂停,在播放的需求。

来看AdvancedPlayer类源码,其中有一个decodeFrame()方法用来解析帧,不难发现,它每次只解析一帧,所以,可以继承AdvancedPlayer类,重写该方法,就可以达到记录帧的目的了!

直接放代码。

public class Music {public static void main(String[] args) {String file = "C:\\Users\\surk\\Desktop\\1.mp3";Play play = new Play(file);// 开启play.start();try {Thread.sleep(14000);// 暂停play.stop();Thread.sleep(1000);// 重新播放play.start();} catch (InterruptedException e) {e.printStackTrace();}//结束play.stop();System.out.println("stop!");}}class Play implements Runnable {private final String file;private MyPlayer player = null;private Thread thread = null;public int pauseFrame = 0;public Play(String file) {this.file = file;}public void run() {// 每次开始需要重新创建AdvancedPlayer,否则会报错createPlayer();play();}public void start() {thread = new Thread(this, "Player thread");thread.start();}public void stop() {// 在停止的时候,记录停止帧pauseFrame = player.getFrame();player.close();thread = null;}protected void play() {try {player.play(pauseFrame, Integer.MAX_VALUE);} catch (JavaLayerException ex) {System.err.println("Problem playing audio: " + ex);}}protected void createPlayer() {try {player = new MyPlayer(new FileInputStream(file));} catch (FileNotFoundException | JavaLayerException e) {e.printStackTrace();}}
}class MyPlayer extends AdvancedPlayer {/*** 当前帧*/@Getterprivate int frame = 0;public MyPlayer(InputStream stream) throws JavaLayerException {super(stream);}/*** 重写decodeFrame方法,每次解析,记录帧+1*/protected boolean decodeFrame() throws JavaLayerException {frame++;return super.decodeFrame();}}

这里选择在停止时获取帧,没有使用监听器来获取帧,因为它记录的帧是不对的!

在测试时,发现重新播放时可能会丢失一两帧,不过影响不大,可以在停止时少记录两帧(pauseFrame = player.getFrame()-2;)就可以了。

3.如何循环播放?

同样的,无论是AdvancedPlayer类还是Player类,都没有提供循环播放的方法,所以,这个也需要自己去实现。

这个实现比较简单,直接放代码。

public class Music {public static void main(String[] args) {String file = "C:\\Users\\surk\\Desktop\\2.mp3";Play play = new Play(file);// 开启play.start();try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("stop!");}}class Play implements Runnable {private final String file;private AdvancedPlayer player = null;private Thread thread = null;public Play(String file) {this.file = file;}public void run() {// 每次开始需要重新创建AdvancedPlayer,否则会报错createPlayer();play();}public void start() {thread = new Thread(this, "Player thread");thread.start();}public void stop() {player.stop();thread = null;}protected void play() {try {player.play();} catch (JavaLayerException ex) {System.err.println("Problem playing audio: " + ex);}}protected void createPlayer() {try {player = new AdvancedPlayer(new FileInputStream(file));// 这里设置一个监听器,来监听停止事件player.setPlayBackListener(new PlaybackListener() {@Overridepublic void playbackFinished(PlaybackEvent event) {// 当播放完毕后,会触发该事件,再次调用start()即可!start();}});} catch (JavaLayerException | IOException e) {e.printStackTrace();}}
}

可以通过监听停止事件,重新调用start()。就可以循环播放啦!

4.如何暂停播放+循环播放?

这个问题嘛,结合已有代码,自己实现吧!

提示一下。

1.你需要注意暂停帧(pauseFrame)的重置。

2.AdvancedPlayer类有两个停止方法,close()和stop(),其中stop会触发停止事件,close则不会触发停止事件。这样就可以通过close方法来实现暂停,通过stop方法来实现停止播放。

总体来说,jLayer这个jar包,年代过于久远,功能很有限,只能说凑合能用,它的源码读起来不是很困难,读读源码大概就知道怎么回事了,所以想要实现更多的功能,一是自己写:),二是寻找其他jar包。

java程序添加背景音乐相关推荐

  1. idea java opts_idea为java程序添加启动参数(program arguments,vm arguments,Environment variable),并在程序中获取使用...

    # 一.问题描述 # ## 1. 开发环境 ## 1. idea2019 2. jdk1.8 3. win10 在实际的项目开发中我们经常需要为java程序添加一些启动参数(又叫java启动命令),比 ...

  2. java关闭事件_为Java程序添加退出事件

    package org.swing.os; import java.util.*; import java.io.*; /** * 为Java程序添加退出事件 * * @author wuhq */ ...

  3. Java 中添加背景音乐

    Java 中添加背景音乐 GUI 中添加背景音乐 添加循环播放的背景音乐 背景音乐音量调节 好了,以上主要是多放几个 关键词,方便能让需要的人都能搜到 以下就是可直接使用的方法, 之后按提示导包就 o ...

  4. java编写添加背景音乐代码_java代码中简单添加背景音乐(亲测有效)

    在做java贪吃蛇游戏课设时,想添加背景音乐,用了以下很简单的步骤即可完成,亲测有效哦! 调用方法: new Thread(()->{while(true) {Data.playMusic(); ...

  5. java代码添加背景音乐(自用)

    自用记录,亲测可行. java课设,马里奥的小游戏,总觉得没有背景音乐就少了点乐趣,试了很多种添加背景音乐,这个成功了!! 原作链接: Java小游戏中加背景音乐--有图有真相_一如既往的博客-CSD ...

  6. Java代码添加背景音乐

    太心塞!弄了很久才终于把Java添加背景音乐实现了.不过还是很Happy! 这次介绍的办法,是只要一打开Java Application,便可直接听到背景音乐.代码保存,方便以后再次利用. 1 pac ...

  7. 给java swing程序添加背景音乐或音效

    "在平时做小程序中我们可能会想在程序中加上一些背景音乐和音效,以下是我使用的方法(非本人原创)." 源码如下: package Wuzi;import javax.sound.sa ...

  8. java 如何添加背景音乐_Java程序怎样添加背景音乐?

    哆啦的时光机 你可以试一下下面的代码import java.applet.AudioClip;import java.io.*;import java.applet.Applet;import jav ...

  9. 原生微信小程序添加背景音乐

    1.app.js创建背景音乐 App({globalData:{bgm_src: "", //背景音乐地址bgrAudioContext: "",bg_is_p ...

最新文章

  1. sql server 2008数据导入Oracle方法
  2. 三极管在ad中的原理图库_555时基电路内部结构及其工作原理
  3. 人工智能和大数据的开发过程中需要注意这12点
  4. ubuntu18.04下pyaudio的安装
  5. 如何做好OA流程审批?
  6. expdp impdp中 exclude/include 的使用
  7. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...
  8. 在Hibernate的session中同时有两个相同id的同类型对象,修改失败
  9. 面试题05. 替换空格
  10. 基于c#的相关性分析_不同区间衰退路径下锂离子电池的性能相关性及温度适用性分析...
  11. 查询oracle 表记录数,Oracle 查询所有表的记录数
  12. Matlab系统辨识工具箱
  13. iOS两个强制旋转屏幕的方法
  14. Vsphere平台虚拟机vmdk文件丢失重建
  15. 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
  16. 从0开发豆果美食小程序——搜索组件
  17. c语言内部函数与,内函数和外函数关系 有关C语言的内部函数和外部函数的定义说明...
  18. linux重新初始化网络命令,如何在Ubuntu 18.04 Bionic Beaver Linux上重新启动网络
  19. FULL JOIN 数据库全连接查询SQL
  20. QQ 引流引发的灰色地带产业

热门文章

  1. 上拉电阻与下拉电阻的作用总结
  2. 创新型中小企业评价标准有哪些?
  3. 大卖家私域流量分享:从淘系私域到微信私域 品牌拓展私域流量的核心法则是…...
  4. 三维目标检测新SOTA---ADFDetV2论文解读
  5. 管家婆辉煌版密码遗忘处理
  6. 智能网联汽车网络安全浅析(上)
  7. LeetCode - 354 俄罗斯套娃信封问题
  8. 展厅空间设计 | 品牌与消费者的深层连接
  9. 送给未来的自己10句话
  10. 浏览器火狐谷歌都被889hao.com劫持自动跳转到2345.com彻底处理方法