最近在做javafx的音频播放时碰到一个奇怪的问题,一个7s的音频文件有时候可以正常播放,有时候又会中断,特别是播放过程中如果再次出发,几乎必然中断,为了排除其他影响,我简单写了个测试程序,核心代码是这样的:
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Media media = new Media(getClass().getResource("/course_game_lose_1.mp3").toString());
MediaPlayer player = new MediaPlayer(media);
player.setOnReady(new Runnable() {
@Override
public void run() {
player.play();
}
});
}
});
点击播放的时候还是经常播放不完整,后来google许久发现这么一篇记录https://stackoverflow.com/questions/6241687/mediaplayer-stop-playing-after-about-5-seconds
,说是android中的mediaPlayer经常在播放5s后停止,下面给出的解答是MediaPlayer对象不能放在方法里面,要作为成员变量或者静态变量,意思要延长它的生命周期,防止被gc回收,想到javafx和android都是运行在jvm,所以我试了一下,确实可以解决问题:
public class Main extends Application {
MediaPlayer player;
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox();
Button button = new Button();
button.setText("播放");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Media media = new Media(getClass().getResource("/course_game_lose_1.mp3").toString());
player = new MediaPlayer(media);
player.setOnReady(new Runnable() {
@Override
public void run() {
player.play();
}
});
}
});
root.getChildren().addAll(button);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setWidth(400);
primaryStage.setHeight(300);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
不过让我不能理解的是音频尚未播放完,局部变量的mediaPlayer就会被回收吗,还是说这个并不是产生问题的根本原因?