JavaFx制作简易的mp4播放器
在制作视频播放器时,用JAVA语言编写是个很方便的选择。虽然JavaFX从JDK11开始就分离,但是在网上稍微搜索下就可以找到解决方法(在命令行下运行的命令是最清楚的)。原谅我不太聪明,花了一整天,拼接和整合了一些代码,制作了下面的简单mp4播放器。功能很简单,界面功能:右边是扫描指定目录下的mp4文件,点击即可播放;下边是播放/暂停、从头开始播放、可拖动的进度条。专业个人使用还行,对在普适性上存在一些问题:1,播放MP4的文件名有要求,名字中不能空格、很多正常的符号等;2,点击右边按钮后存在播放不了视频的意外情况;3,进度条不能随着视频播放实时更新;4,媒体路径被写死。
1, windows系统下设置环境变量PATH_TO_FX=e:javafx-sdk-14.0.1lib
2, 编写Java文件:MediaDemo.java
1 import javafx.application.Application;
2 import javafx.stage.Stage;
3 import javafx.geometry.Pos;
4 import javafx.geometry.Orientation;
5 import javafx.scene.Scene;
6 import javafx.scene.control.Button;
7 import javafx.scene.control.Label;
8 import javafx.scene.control.Slider;
9 import javafx.scene.control.RadioButton;
10 import javafx.scene.control.ToggleGroup;
11 import javafx.scene.layout.FlowPane;
12 import javafx.scene.layout.BorderPane;
13 import javafx.scene.layout.HBox;
14 import javafx.scene.layout.VBox;
15 import javafx.scene.layout.Region;
16 import javafx.scene.layout.Priority;
17 import javafx.scene.media.Media;
18 import javafx.scene.media.MediaPlayer;
19 import javafx.scene.media.MediaView;
20 import javafx.util.Duration;
21 import java.io.File;
22
23 public class MediaDemo extends Application {
24 private static final String MEDIA_DIR = "E:/xyz/";
25
26 @Override
27 public void start(Stage primaryStage) {
28 MediaView mediaView = new MediaView();
29 //mediaView.setSmooth(true);
30
31 Button playButton = new Button(">");
32 playButton.setOnAction(e -> {
33 MediaPlayer mPlayer = mediaView.getMediaPlayer();
34 if (playButton.getText().equals(">")) {
35 mPlayer.play();
36 playButton.setText("||");
37 } else {
38 mPlayer.pause();
39 playButton.setText(">");
40 }
41 });
42
43
44 Button rewindButton = new Button("<<");
45 rewindButton.setOnAction(e -> mediaView.getMediaPlayer().seek(Duration.ZERO));
46
47 /*Slider slVolume = new Slider();
48 slVolume.setPrefWidth(150);
49 slVolume.setMaxWidth(Region.USE_PREF_SIZE);
50 slVolume.setMinWidth(30);
51 slVolume.setValue(50);
52 mediaPlayer.volumeProperty().bind(
53 slVolume.valueProperty().divide(100));
54 */
55 // 播放进度条
56 Slider slTime = new Slider();
57 HBox.setHgrow(slTime,Priority.ALWAYS);
58 slTime.setMinWidth(50);
59 slTime.setMaxWidth(Double.MAX_VALUE);
60 //slTime.setShowTickLabels(true);
61 slTime.valueProperty().addListener(ov -> {
62 Duration total = mediaView.getMediaPlayer().getTotalDuration();
63 // 当前进度 total * progress / 100.0
64 Duration s1 = total.multiply(slTime.getValue()).divide(100.0);
65 mediaView.getMediaPlayer().seek(s1);
66 });
67
68 HBox progressHBox = new HBox(20);
69 progressHBox.setAlignment(Pos.CENTER);
70 progressHBox.setMinHeight(30);
71 progressHBox.getChildren().add(slTime);
72
73 HBox hBox = new HBox(10);
74 hBox.setAlignment(Pos.CENTER);
75 hBox.getChildren().addAll(playButton, rewindButton,
76 new Label("Progress"), slTime);
77
78 BorderPane pane = new BorderPane();
79 pane.setCenter(mediaView);
80 pane.setBottom(hBox);
81
82 mp4List(pane, mediaView);
83
84 Scene scene = new Scene(pane, 670, 500);
85 primaryStage.setTitle("MeidaDemo");
86 primaryStage.setScene(scene);
87 primaryStage.show();
88 }
89
90 /**
91 * 媒体播放列表
92 */
93 public void mp4List(BorderPane pane, MediaView mediaView) {
94 File dir = new File(MEDIA_DIR);
95 String[] mp4s = dir.list((f, n) -> n.matches(".*56mp4"));
96 VBox vBox = new VBox();
97 ToggleGroup group = new ToggleGroup();
98 for(int i = 0; i < mp4s.length; i++) {
99 RadioButton radioButt = new RadioButton(mp4s[i]);
100 radioButt.setToggleGroup(group);
101 radioButt.setOnAction(e -> {
102 MediaPlayer mp = mediaView.getMediaPlayer();
103 if (mp != null) {
104 mp.dispose();
105 }
106 MediaPlayer mPlayer = new MediaPlayer(new Media("file:/" + MEDIA_DIR + radioButt.getText()));
107 mPlayer.play();
108 mediaView.setMediaPlayer(mPlayer);
109 System.gc();
110 });
111 vBox.getChildren().add(radioButt);
112 }
113 pane.setRight(vBox);
114 }
115 }


