JavaFX实现视频播放器

news/2025/1/11 1:23:25/

对于很多Java开发小伙伴来说,不少童鞋都了解过JavaFX,但介于JavaFX的局限性,可能大多数Java开发者也不是很了解,因而在JavaFX中自然也就缺乏实战经验,但是有时候呢我们也想自己研发一些小程序,比如说前面文章中给大家提到的 图片浏览器 ,或者说音频浏览器、视频浏览器等,那今天小编就带大家走进视频浏览器的编程过程!

效果图如下:

要求:

  1. 背景主色为黑色;

  1. 视频上下居中,左右居中,并保持界面中最大化显示;

  1. 进度条控制播放进度;

  1. 音频大小可拖动音频进度条控制;

  1. 默认打开即播放,点击画面暂停,继续单击又开始播放。

难点分析:

  1. 通过Media指定播放视频文件,通过MediaPlayer实现播放控制;

  1. 使用BorderPane布局方式让视频横向和纵向都居中;

  1. 使用Slider绑定播放进度条事件动态显示播放进度;

  1. 设置高度宽度改变事件来重置容器宽度和高度。

细节优化点:

  1. 当全屏播放时,显示退出全屏,并且不显示头部标题,退出全屏时操作相反;

  1. 视频播放时需要根据视频播放时长自动计算播放时长;

  1. ESC退出全屏播放。

好啦,废话不多说,那我们接下来就用代码来实现看看效果吧。

代码如下:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
import javafx.util.Duration;public class VideoPlayerApplication extends Application {private Stage primaryStage;private Label time = new Label();private double allTime = 0;private Slider playSlider;private Slider audioSlider = new Slider(0, 100, 80);private boolean isplay;private Media media;private MediaPlayer player;private String title;public VideoPlayerApplication() {// 默认初始化标题及其文件URLthis.title = "测试";this.media = new Media("http://192.168.18.9:8080/files/20230313/9c49403b-929b-4f65-843b-4c122432b90d.mp4");}public VideoPlayerApplication(String title, String url) {this.media = new Media(url);this.title = title;}@Overridepublic void start(Stage primaryStage) {this.primaryStage = primaryStage;player = new MediaPlayer(media);player.play();isplay = true;MediaView mediaView = new MediaView(player);VBox anchorPane = new VBox(mediaView);anchorPane.setAlignment(Pos.CENTER);anchorPane.setPrefWidth(800);anchorPane.setPrefHeight(600);anchorPane.setStyle("-fx-background-color: #000;");BorderPane root = new BorderPane(anchorPane);root.setPrefWidth(800);root.setPrefHeight(600);player.volumeProperty().bind(audioSlider.valueProperty().divide(100));root.setOnMouseClicked(event -> {playOrStop();});playSlider = new Slider();playSlider.setMin(0);playSlider.setMax(500);playSlider.setPrefWidth(800);playSlider.setValue(0);VBox.setMargin(playSlider, new Insets(-50, 0, 0, 0));anchorPane.getChildren().add(playSlider);Label full = new Label("全屏");full.setOnMouseClicked(event -> {fullScreen(full);});Label label = new Label(">");label.setTextAlignment(TextAlignment.CENTER);label.setAlignment(Pos.CENTER);label.setPrefWidth(650);label.setMinWidth(80);Label vol = new Label("音量");vol.setStyle("-fx-text-fill:white");audioSlider.setMaxWidth(80);audioSlider.setMinWidth(30);
//        audioSlider.setRotate(-90);HBox hBox = new HBox(full, label, vol, audioSlider);hBox.setPadding(new Insets(20, 0, 0, 0));anchorPane.getChildren().add(hBox);Scene scene = new Scene(root);primaryStage.setTitle(title);primaryStage.setScene(scene);primaryStage.show();player.currentTimeProperty().addListener((x, y, z) -> {if (isplay) {double currents = player.getCurrentTime().toSeconds();allTime = player.getStopTime().toSeconds();playSlider.setValue(currents / allTime * 500);time.setText(formattime(currents, allTime, 0));}});playSlider.setOnMousePressed(x -> {isplay = false;});playSlider.setOnMouseReleased(x -> {player.seek(Duration.seconds(playSlider.getValue() / 500 * allTime));isplay = true;});ChangeListener<Number> changeListener = (event, oldVal, newVal) -> {System.out.println("oldVal = " + oldVal + ", newVal = " + newVal);mediaView.setFitHeight(primaryStage.getHeight() - 40);mediaView.setFitWidth(primaryStage.getWidth());};primaryStage.widthProperty().addListener(changeListener);primaryStage.heightProperty().addListener(changeListener);primaryStage.fullScreenProperty().addListener((event, q, d) -> {fullScreen(full);});root.setOnKeyPressed(event -> {System.out.println(event.getCode());if (KeyCode.SPACE.equals(event.getCode())) {playOrStop();}});primaryStage.setOnCloseRequest(event -> {player.pause();player.stop();});mediaView.setFitHeight(primaryStage.getHeight() - 40);mediaView.setFitWidth(primaryStage.getWidth());}private void playOrStop() {if (isplay) {isplay = false;player.pause();} else {Duration seconds = Duration.seconds(playSlider.getValue() / 500 * allTime);player.seek(seconds);isplay = true;player.play();}}private void fullScreen(Label full) {if ("全屏".equals(full.getText())) {primaryStage.setFullScreen(true);audioSlider.setVisible(false);playSlider.setVisible(false);full.setText("退出全屏");} else {primaryStage.setFullScreen(false);audioSlider.setVisible(true);playSlider.setVisible(true);full.setText("全屏");}}public static String formattime(double this_time, double all_time, int type) {String thistime = String.format("%02d:%02d:%02d", (int) this_time / 3600, (int) this_time % 3600 / 60, (int) this_time % 60);String alltime = String.format("%02d:%02d:%02d", (int) all_time / 3600, (int) all_time % 3600 / 60, (int) all_time % 60);return type == 1 ? thistime : type == 2 ? alltime : thistime + "/" + alltime;}
}

有了这个基础,我们是不是可以自己做一个视频播放器呢,那答案一定是肯定的,但是如果是支持缩放,也就是说界面大小可以由用户自由缩放,这样的话处理起来会复杂的多,如果有想法的话,建议固定默认播放界面大小(但是全屏一定得支持,不然用户体验及其不友好),剩余的大家可以自由探索,如果是编程过程中有碰到问题的,随时可以私信我,也可以通过关注官方微信公众号“小筱在线”获取更多职场资料。

后续将更新升级版播放器,UI样式如下:

好啦,今天课程就到此结束,下课!


http://www.ppmy.cn/news/498272.html

相关文章

Qt视频播放器[QMediaPlayer+QVideowidget]

目录 参考一、安装K-Lite 解码器二、Qt代码结构VideoPlayer.promain.cppvideoplayer.h 播放器videoplayer.cpp 播放器videoplayer.ui 播放器playerslider.h 自定义进度条playerslider.cpp 自定义进度条 效果源码文件错误解决 参考 Qt实现视频播放器 Qt播放视频报错 DirectShowP…

视频播放器基础知识

1.视频播放器原理 播放一个视频文件的流程如下&#xff1a; 2.常用播放器 1&#xff09; 跨平台系列&#xff08;非DirectShow框架&#xff09; VLC&#xff0c; Mplayer&#xff0c; ffplay…… 2&#xff09; Windows系列&#xff08;DirectShow框架&#xff09; 完美解码&am…

android视频播放器api,03.视频播放器Api说明

03.视频播放器Api说明 目录介绍01.最简单的播放 02.如何切换视频内核 03.切换视频模式 04.切换视频清晰度 05.视频播放监听 06.列表中播放处理 07.悬浮窗口播放 08.其他重要功能Api 09.播放多个视频 10.VideoPlayer相关Api 11.Controller相关Api 12.边播放边缓存api 13.类似抖音…

阿里云视频播放器

文章目录 视频播放器介绍实战引入脚本文件和 css 文件初始化视频播放器播放地址播放播放凭证播放&#xff08;推荐&#xff09; test代码 总结&#xff1a; 视频播放器介绍 阿里云的视频播放器类比 HTML5视频播放标签video和音频播放标签audio标签 只是阿里云视频播放器是针对…

java 调用本地播放器_Java调用本地播放器播放视频文件

java调用本地播放器播放视频文件. 呼叫本地播放器无法播放指定文件的描述. public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { Runtime rn Runtime.getRuntime(); Process p null; try { p rn.exec("…

java视频播放器制作_java创建简易视频播放器

java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个简易的视频播放器,对于C/C++残疾者而言是不可能的,于是萌生了用Java编写的想法。具体经验分享一下。 目标:制作…

Android VideoView 视频播放器 仿抖音

前言 最近项目有个需求 , 做个类似抖音的视频效果. 又因为包大小的问题不使用第三方SDK,所以使用原生的VideoView开发了一下, 搭配RecyclerView和PageSnapHelper来实现抖音的效果. 全部代码: github 看一下实现流程: 首先创建了一个继承自ConstraintLayout的View,用来实现自己…

最简单的基于DirectShow的示例:视频播放器自定义版

最简单的基于DirectShow的示例文章列表&#xff1a; 最简单的基于DirectShow的示例&#xff1a;视频播放器 最简单的基于DirectShow的示例&#xff1a;视频播放器图形界面版 最简单的基于DirectShow的示例&#xff1a;视频播放器自定义版 最简单的基于DirectShow的示例&…