个人网站:https://cxynw.com/detail/30.html
百度网盘: 密码:avpy
官网 点击打开链接
首先,感谢您能抽空阅读我的博客,在这里我会使用2种播放MP3格式音频的方法。第一种,使用JavaFX的javafx.scene.media.*包播放。第二种,使用第三方库进行播放,第三方库的下载地址点击打开链接。
JavaFX播放MP3,这种方法不需要下载第三方库,比较方便,但是不能直接用在Java Project里面,能直接用在JavaFX Project里面。
这个包里面,有几个重要的类,它们的层次关系是这样的Media->MediaPlayer->MediaView
Meida类用来封装媒体数据
MediaPlayer类用来控制媒体文件的各种行为
MediaView类用来显示媒体,但是我介绍的是播放MP3,所以文中没有这个类。
import java.io.File;
import java.net.URL;
import javafx.application.Application;
import javafx.scene.media.*;
import javafx.stage.Stage;
/**
* 目前支持的编码格式:
*
* 音频:
*
* MP3;
*
* 包含非压缩PCM的AIFF;
*
* 包含非压缩PCM的WAV;
*
* 使用AAC音频的MPEG-4;(MP4)
*
* 使用JavaFX播放MP3文件,需要导入javafx.scene.media包
*/
class Sound extends Object {
private Media media;// 相当于媒体播放器
private MediaPlayer mediaPlayer;// 相当于媒体控制器
/**
* 播放音乐
*/
public void play() {
mediaPlayer.play(); // JavaFX提供的MediaPlayer有播放方法,直接调用即可
}
/**
* 暂停播放
*/
public void pause() {
mediaPlayer.pause();// JavaFX提供的MediaPlayer有暂停方法,直接调用即可
}
/**
* 停止播放
*/
public void stop() {
mediaPlayer.stop();// JavaFX提供的MediaPlayer有停止播放方法,直接调用即可
}
/**
* 循环播放
*/
public void loop() {
setPlayCount(MediaPlayer.INDEFINITE);// this的方法
play();// this的方法
}
/**
* 获取现在音乐播放到哪里了
*
* @return 事件(单位秒)
*/
public double getNewTime() {
return mediaPlayer.getCurrentTime().toSeconds();
}
/**
* 设置音乐的声音大小0-1
*
* @param v
* 音量
*/
public void setVolume(double v) {
mediaPlayer.setVolume(v);
}
/**
*
* @param count
* 设置媒体文件循环播放的次数
*/
public void setPlayCount(int count) {
mediaPlayer.setCycleCount(count);
}
/**
* 释放媒体文件占用的空间
*/
public void close() {
mediaPlayer.dispose(); // 不是用Media类来释放内存,要用MediaPlayer控制类来释放内存
System.gc(); // 通知JVM内存回收,调用了dispose方法内存并不会马上被回收,会被标记成垃圾,等待下一次垃圾回收的执行,这里我们手动调用
}
/**
*
* @param URL
* 媒体文件目录,本地文件也要用URL(String)路径
*/
public Sound(String URL, boolean isAutoPlay) {
this.media = new Media(URL);
this.mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAutoPlay(isAutoPlay);
}
/**
*
* @param URL
* 虽然直接传入的事URL,但是是不能直接使用,要转成String类型的URL
*/
public Sound(URL URL, boolean isAutoPlay) {
this(URL.toString(), isAutoPlay);
}
/**
*
* @param file
* 最终转换成URL(String)路径
*/
public Sound(File file, boolean isAutoPlay) {
this(file.toURI().toString(), isAutoPlay);
}
}
public class Main extends Application {
private Sound sound;// 注意,我这里是为了防止被JVM的垃圾回收给回收掉
@Override
public void start(Stage primaryStage) throws Exception {
// 直接复制下来没效果可能是因为连接地址失效了
sound = new Sound("http://sc1.111ttt.cn/2017/1/04/26/297262113196.mp3", false);
sound.loop();// 循环播放
}
public static void main(String[] args) {
launch(args);// 初始化
}
}
使用第三方开源库播放MP3文件,可以前往点击打开链接官网下载,或者在我的百度网盘下载密码:avpy
package com.game.sound;
import java.util.logging.*;
import javazoom.jl.decoder.*;
import javazoom.jl.player.*;
public class MySound extends Thread {
private Player player;
private String musicName;
//加载音乐
public MySound(String musicName) {
this.musicName = musicName;
}
//播放音乐
public void play() {
try {
//我这里的这一种写法要求音频文件要和这个类在同一个包里面
new Player(getClass().getResourceAsStream(musicName)).play();
} catch (JavaLayerException ex) {
Logger.getLogger(MySound.class.getName()).log(Level.SEVERE, null, ex);
}
}
//循环播放音乐
public void loop() {
this.start();
}
@Override
public void run() {
while (true) {
try {
new Player(getClass().getResourceAsStream(musicName)).play();
} catch (JavaLayerException ex) {
Logger.getLogger(MySound.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}