ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java GUI 添加背景音乐

2022-06-28 19:03:33  阅读:166  来源: 互联网

标签:背景音乐 Java java GUI void import 播放 public circulate


第一种方式
import java.applet.AudioClip;
import java.io.*;
import java.applet.Applet;
import java.net.URI;
import java.net.URL;

public class Music {
public void play() {
try {
//音乐文件
File file_music = new File("music/background.wav");
//解析文件组成部分
URI uri_music = file_music.toURI();
//解析文件地址
URL url = uri_music.toURL();
//使用音频剪辑播放,Applet:存储音频文件
AudioClip ac = Applet.newAudioClip(url);
// 循环播放
ac.loop();
//停止播放
// ac.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
}

第二种方式

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

/**
* 音乐播放器
*
* @author cn.clf.音乐
*/
public class MusicPlayer implements Runnable {
File soundFile; // 音乐文件
Thread thread;// 父线程
boolean circulate;// 是否循环播放

/**
* 构造方法,默认不循环播放
*
* @param filepath
* 音乐文件完整名称
* @throws FileNotFoundException
*/
public MusicPlayer(String filepath) throws FileNotFoundException {
this(filepath, false);
}

/**
* 构造方法
*
* @param filepath
* 音乐文件完整名称
* @param circulate
* 是否循环播放
* @throws FileNotFoundException
*/
public MusicPlayer(String filepath, boolean circulate)
throws FileNotFoundException {
this.circulate = circulate;
soundFile = new File(filepath);
if (!soundFile.exists()) {// 如果文件不存在
throw new FileNotFoundException(filepath + "未找到");
}
}

/**
* 播放
*/
public void play() {
thread = new Thread(this);// 创建线程对象
thread.start();// 开启线程
}

/**
* 停止播放
*/
public void stop() {
thread.stop();// 强制关闭线程
}

/**
* 重写线程执行方法
*/
public void run() {
byte[] auBuffer = new byte[1024 * 128];// 创建128k缓冲区
do {
AudioInputStream audioInputStream = null; // 创建音频输入流对象
SourceDataLine auline = null; // 混频器源数据行
try {
// 从音乐文件中获取音频输入流
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
AudioFormat format = audioInputStream.getFormat(); // 获取音频格式
// 按照源数据行类型和指定音频格式创建数据行对象
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
format);
// 利用音频系统类获得与指定 Line.Info 对象中的描述匹配的行,并转换为源数据行对象
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);// 按照指定格式打开源数据行
auline.start();// 源数据行开启读写活动
int byteCount = 0;// 记录音频输入流读出的字节数
while (byteCount != -1) {// 如果音频输入流中读取的字节数不为-1
// 从音频数据流中读出128K的数据
byteCount = audioInputStream.read(auBuffer, 0,
auBuffer.length);
if (byteCount >= 0) {// 如果读出有效数据
auline.write(auBuffer, 0, byteCount);// 将有效数据写入数据行中
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
} finally {
auline.drain();// 清空数据行
auline.close();// 关闭数据行
}
} while (circulate);// 根据循环标志判断是否循环播放
}
}

import java.io.FileNotFoundException;

/**
* 音效类
*
* @author cn.clf.音乐
*
*/
public class Sound {
static final String DIR = "music/";// 音乐文件夹
static final String BACKGROUD = "background.wav";// 背景音乐
static final String JUMP = "jump.wav";// 跳跃音效
static final String HIT = "hit.wav";// 撞击音效

/**
* 播放跳跃音效
*/
public void jump() {
play(DIR + JUMP, false);// 播放一次跳跃音效
}

/**
* 播放撞击音效
*/
public void hit() {
play(DIR + HIT, false);// 播放一次撞击音效
}

/**
* 播放背景音乐
*/
public void backgroud() {
play(DIR + BACKGROUD, true);// 循环播放背景音乐
}

/**
* 播放
*
* @param file
* 音乐文件完整名称
* @param circulate
* 是否循环播放
*/
public void play(String file, boolean circulate) {
try {
// 创建播放器
MusicPlayer player = new MusicPlayer(file, circulate);
player.play();// 播放器开始播放
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}

标签:背景音乐,Java,java,GUI,void,import,播放,public,circulate
来源: https://www.cnblogs.com/clf125800/p/16420683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有