JavaFx制作简易的mp4播放器

在制作视频播放器时,用JAVA语言编写是个很方便的选择。虽然JavaFX从JDK11开始就分离,但是在网上稍微搜索下就可以找到解决方法(在命令行下运行的命令是最清楚的)。原谅我不太聪明,花了一整天,拼接和整合了一些代码,制作了下面的简单mp4播放器。功能很简单,界面功能:右边是扫描指定目录下的mp4文件,点击即可播放;下边是播放/暂停、从头开始播放、可拖动的进度条。专业个人使用还行,对在普适性上存在一些问题:1,播放MP4的文件名有要求,名字中不能空格、很多正常的符号等;2,点击右边按钮后存在播放不了视频的意外情况;3,进度条不能随着视频播放实时更新;4,媒体路径被写死。

1, windows系统下设置环境变量PATH_TO_FX=e:\javafx-sdk-14.0.1\lib

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 }

3,编译Java文件

javac.exe --module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.fxml,javafx.media,javafx.base,javafx.graphics -encoding utf-8 MediaDemo.java

4,运行

java.exe --module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.media,javafx.base,javafx.graphics MediaDemo

5,运行效果

(1)初始界面截图

JavaFx制作简易的mp4播放器

(2)播放视频截图

JavaFx制作简易的mp4播放器

6,编写BAT文件,一键运行

@echo off
set dir=E:\xyz\
E: & cd %dir%
set /p passwd=请输入密码:
if "%passwd%" == "2233media" (
javac.exe --module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.fxml,javafx.media,javafx.base,javafx.graphics -encoding utf-8 %dir%MediaDemo.java
java.exe --module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.media,javafx.base,javafx.graphics MediaDemo
) else (
    echo "密码错误!"
)
pause

Original: https://www.cnblogs.com/dnghg/p/16328727.html
Author: dnghong
Title: JavaFx制作简易的mp4播放器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592379/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 《穷爸爸富爸爸关键结论》

    富爸爸上了停在小店外的小卡车,这时他对我们说:”继续工作,孩子们,你们越快忘记你们的工资,你们未来的生活就会越轻松,继续用你们的头脑思考,不求回报地工作,很快就会发现比…

    Java 2023年6月8日
    062
  • Spring5.0源码学习系列之Spring AOP简述

    前言介绍 附录:Spring源码学习专栏 在前面章节的学习中,我们对Spring框架的IOC实现源码有了一定的了解,接着本文继续学习Springframework一个核心的技术点A…

    Java 2023年5月30日
    0128
  • 【算法】冒泡排序算法

    冒泡排序算法 简介:冒泡排序是对数组进行排序的一种方式,常见的排序算法还有选择排序,插入排序、希尔排序、归并排序、堆排序等,这里介绍最简单的排序算法——冒泡排序。 思路 假设长度为…

    Java 2023年6月9日
    0117
  • day44-反射03

    Java反射03 3.通过反射获取类的结构信息 3.1java.lang.Class类 getName:获取全类名 getSimpleName:获取简单类名 getFields:获…

    Java 2023年6月15日
    063
  • JS 模块化- 05 ES Module & 4 大规范总结

    1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue、React 中大量使用,大家应该非常熟悉。TypeScript 中的模块化与 ES 类似。…

    Java 2023年6月16日
    080
  • Java(12)静态字段与静态方法

    之前我们都定义的 main方法都被标记了 static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为 static,每个类只有一个这样的字段。而对于非静态…

    Java 2023年6月9日
    075
  • Reference 引用类

    Reference Queue *Method Summary: Reference *Method Summary: void():Clears this reference o…

    Java 2023年6月8日
    072
  • Java反射机制

    概述 Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以…

    Java 2023年6月7日
    080
  • Java邮件发送中的setRecipient方法使用

    一、方法 setRecipient(Message.RecipientType type, Address address),是用于设置邮件的接收者。 1、有两个参数,第一个参数是…

    Java 2023年6月7日
    071
  • Java,求一个字符串中指定字符出现的次数

    如题,这里介绍两种方式 1、把字符串转化成字符数组,然后通过for循环比对出结果 这种方式虽然明面上看着有for循环,实际执行速度却很快,也很好理解。 2、用string的spli…

    Java 2023年6月5日
    093
  • 碎碎念六二

    07.01 心,完全沉静下来,阅读与创作,便是快乐的开始。 心静下来,做什么事情都会快乐的吧! 又是什么,让心静不下来呢?忧疑与恐惧,名利与渴望。 07.03 小心保存情感,蓄积,…

    Java 2023年6月9日
    073
  • Python 的线程与进程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月8日
    087
  • Java初步使用

    java 目前属于甲骨文, 长期支持版本为 java8 和 java11, 主要学习JavaEE (Java Enterprise Edition) 企业版java特性: 强类型 …

    Java 2023年6月7日
    084
  • Java开发学习(六)—-DI依赖注入之setter及构造器注入解析

    一、DI依赖注入 首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法) 构造方法 依赖注入描述了在容器中建立bean与…

    Java 2023年5月29日
    0107
  • 【设计模式】Java设计模式-外观模式

    Java设计模式 – 外观模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个有梦有戏的人…

    Java 2023年6月16日
    0101
  • 性能优化必备——火焰图

    引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 …

    Java 2023年6月15日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球