java程序添加背景音乐
在写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程序添加背景音乐相关推荐
- idea java opts_idea为java程序添加启动参数(program arguments,vm arguments,Environment variable),并在程序中获取使用...
# 一.问题描述 # ## 1. 开发环境 ## 1. idea2019 2. jdk1.8 3. win10 在实际的项目开发中我们经常需要为java程序添加一些启动参数(又叫java启动命令),比 ...
- java关闭事件_为Java程序添加退出事件
package org.swing.os; import java.util.*; import java.io.*; /** * 为Java程序添加退出事件 * * @author wuhq */ ...
- Java 中添加背景音乐
Java 中添加背景音乐 GUI 中添加背景音乐 添加循环播放的背景音乐 背景音乐音量调节 好了,以上主要是多放几个 关键词,方便能让需要的人都能搜到 以下就是可直接使用的方法, 之后按提示导包就 o ...
- java编写添加背景音乐代码_java代码中简单添加背景音乐(亲测有效)
在做java贪吃蛇游戏课设时,想添加背景音乐,用了以下很简单的步骤即可完成,亲测有效哦! 调用方法: new Thread(()->{while(true) {Data.playMusic(); ...
- java代码添加背景音乐(自用)
自用记录,亲测可行. java课设,马里奥的小游戏,总觉得没有背景音乐就少了点乐趣,试了很多种添加背景音乐,这个成功了!! 原作链接: Java小游戏中加背景音乐--有图有真相_一如既往的博客-CSD ...
- Java代码添加背景音乐
太心塞!弄了很久才终于把Java添加背景音乐实现了.不过还是很Happy! 这次介绍的办法,是只要一打开Java Application,便可直接听到背景音乐.代码保存,方便以后再次利用. 1 pac ...
- 给java swing程序添加背景音乐或音效
"在平时做小程序中我们可能会想在程序中加上一些背景音乐和音效,以下是我使用的方法(非本人原创)." 源码如下: package Wuzi;import javax.sound.sa ...
- java 如何添加背景音乐_Java程序怎样添加背景音乐?
哆啦的时光机 你可以试一下下面的代码import java.applet.AudioClip;import java.io.*;import java.applet.Applet;import jav ...
- 原生微信小程序添加背景音乐
1.app.js创建背景音乐 App({globalData:{bgm_src: "", //背景音乐地址bgrAudioContext: "",bg_is_p ...
最新文章
- sql server 2008数据导入Oracle方法
- 三极管在ad中的原理图库_555时基电路内部结构及其工作原理
- 人工智能和大数据的开发过程中需要注意这12点
- ubuntu18.04下pyaudio的安装
- 如何做好OA流程审批?
- expdp impdp中 exclude/include 的使用
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)...
- 在Hibernate的session中同时有两个相同id的同类型对象,修改失败
- 面试题05. 替换空格
- 基于c#的相关性分析_不同区间衰退路径下锂离子电池的性能相关性及温度适用性分析...
- 查询oracle 表记录数,Oracle 查询所有表的记录数
- Matlab系统辨识工具箱
- iOS两个强制旋转屏幕的方法
- Vsphere平台虚拟机vmdk文件丢失重建
- 爱荷华州立 计算机博士,美国爱荷华州立大学无损检测中心裴宁博士来我院讲学...
- 从0开发豆果美食小程序——搜索组件
- c语言内部函数与,内函数和外函数关系 有关C语言的内部函数和外部函数的定义说明...
- linux重新初始化网络命令,如何在Ubuntu 18.04 Bionic Beaver Linux上重新启动网络
- FULL JOIN 数据库全连接查询SQL
- QQ 引流引发的灰色地带产业