JavaFX自带解码MP3文件功能,并且可以自由控制音量和播放进度。下面通过一个小例子实现此功能:
注意:JDK8自带JavaFX组件,但JDK 11移除了JavaFX,请用JDK8运行以下代码。
import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;
import javafx.util.Duration;
public class JavaFXMP3Player extends Application {
private Slider rollingSlider;// 播放进度滑动条
private Slider soundSlider;// 音量滑动条
private ToggleButton playButton;// 播放按钮
private MediaPlayer player;// 播放器
@Override
public void start(Stage stage) throws Exception {
/*
* 网络音频文件可以用以下方式创建连接对象
* java.net.URL mp3 = new java.net.URL("http://127.0.0.1:8080/demo.mp3");
*/
//被播放的MP3文件
File mp3 = new File("F:\\demo.mp3");
// MP3音频文件的媒体对象
Media m = new Media(mp3.toURI().toString());
// 创建播放此媒体对象的播放器
player = new MediaPlayer(m);
// 设置无限循环播放
player.setCycleCount(MediaPlayer.INDEFINITE);
// 带有选中状态的播放按钮
playButton = new ToggleButton("播放");
// 声音滚动条
soundSlider = new Slider();
// 最小音量是0
soundSlider.setMin(0);
// 最大音量是1
soundSlider.setMax(1.0);
// 音量滚动条与播放器音量绑定
soundSlider.valueProperty().bindBidirectional(player.volumeProperty());
// 进度滚动条
rollingSlider = new Slider();
// 进度滚动条与播放器进度绑定
rollingSlider.valueProperty().bindBidirectional(player.audioSpectrumIntervalProperty());
// 垂直箱式布局
VBox root = new VBox(10);
root.getChildren().add(playButton);
root.getChildren().add(soundSlider);
root.getChildren().add(rollingSlider);
addEvent();// 组件添加事件
// 创建场景
Scene sc = new Scene(root, 150, 200);
// 顶层窗口载入场景
stage.setScene(sc);
stage.show();
}
/**
* 组件添加事件
*/
private void addEvent() {
// 当播放进度发生变化时
player.currentTimeProperty().addListener(n -> {
// 进度滚动条的值同步播放的秒数
rollingSlider.setValue(player.getCurrentTime().toSeconds());
});
// 播放结束之后
player.setOnEndOfMedia(() -> {
playButton.setText("播放");// 更改按钮文本
playButton.setSelected(false);// 按钮可用
player.pause();// 暂停播放
});
// 播放按钮被点击时
playButton.setOnAction(n -> {
// 如果是选中状态
if (playButton.isSelected()) {
// 开始播放
player.play();
// 进度条最大值设为播放器的最大秒数
rollingSlider.setMax(player.getStopTime().toSeconds());
// 按钮文本改为暂停
playButton.setText("暂停");
} else {
// 播放器暂停
player.pause();
// 恢复按钮的文本
playButton.setText("播放");
}
});
// 进度滚动条被鼠标按住
rollingSlider.setOnMousePressed(n -> {
// 将播放器的时间改为滚动条对应的值
player.seek(new Duration(rollingSlider.getValue() * 1000));
});
// 进度滚动条被鼠标释放
rollingSlider.setOnMouseDragged(n -> {
// 将播放器的时间改为滚动条对应的值
player.seek(new Duration(rollingSlider.getValue() * 1000));
});
}
public static void main(String[] args) {
launch();// 启动
}
}
运行之后的小窗口如下图所示,第一个滚动条是音量,第二个滚动条是进度条,鼠标可以随意拖拽这两个滚动条以实现控制播放效果。