当前位置: 首页 > news >正文

JavaFX实现视频播放功能

一、前言
最近使用javaFx写了个简单的视频播放功能,可以实现打开本地视频播放。

二、实现
1.使用jdk8自带的javaFx包实现,首先定义一个类VideoPlayer。
代码如下:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.property.Property;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaException;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.FileChooser;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.util.Duration;import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.util.concurrent.atomic.AtomicBoolean;public class VideoPlayer extends Application {Button play,full,openFile;MediaPlayer mediaPlayer;MediaView mediaView;public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) throws MalformedURLException, URISyntaxException {openFile=new Button();openFile.setText("打开文件");openFile.setTranslateX(-300.0);openFile.setTranslateY(340.0);// 将MediaView加入到布局容器StackPane root = new StackPane();// 创建场景Scene scene = new Scene(root, 1000, 800);root.getChildren().add(openFile);primaryStage.setScene(scene);primaryStage.show();openFile.setOnMouseClicked(o->{mediaView = new MediaView(mediaPlayer);openFile(primaryStage);// 加载播放图像Image image = new Image(new File("image/play.png").toURI().toString());ImageView imageView = new ImageView(image);imageView.setFitHeight(45); // 设置图标大小imageView.setFitWidth(45);imageView.setPreserveRatio(true);full=new Button();play=new Button();play.setBackground(null);play.setTranslateX(0.0);play.setTranslateY(340.0);play.setGraphic(imageView);play.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);// 创建MediaPlayer对象mediaPlayer.setAutoPlay(false); // 设置自动播放// 创建MediaView对象mediaView.setFitWidth(990);mediaView.setFitHeight(600);mediaView.setSmooth(true);// 将MediaView加入到布局容器root.getChildren().add(mediaView);root.getChildren().add(play);root.getChildren().add(full);// 创建场景scene.setOnMouseEntered(m->{if (!primaryStage.isFullScreen()) {play.setVisible(true);full.setVisible(true);}});scene.setOnMouseExited(m->{if (!primaryStage.isFullScreen()) {play.setVisible(false);full.setVisible(false);}});// 创建进度条ProgressBar progressBar = new ProgressBar(0);progressBar.setStyle("-fx-height: 8;");progressBar.setStyle("-fx-padding: -1;");Slider timeSlider = new Slider(0,0,0);// 当媒体元数据加载完成后,获取总播放时长mediaPlayer.setOnReady(() -> {Duration totalDuration = mediaPlayer.getTotalDuration();timeSlider.setMax(totalDuration.toSeconds());progressBar.progressProperty().bind(timeSlider.valueProperty().divide(totalDuration.toSeconds()));System.out.println("总播放时长: " + totalDuration.toSeconds() + " 秒");});mediaPlayer.setOnPlaying(() -> {Platform.runLater(()->{if (timeSlider.isFocused()) {return;}timeSlider.setValue(mediaPlayer.getCurrentTime().toSeconds());});});timeSlider.setOnMouseReleased(e -> {// 当拖动结束时更新进度条timeSlider.setValue(mediaPlayer.getCurrentTime().toSeconds());if (timeSlider.getValue()>=timeSlider.getMax()) {play.setGraphic(imageView);}});.........

2.实现的打开文件功能。

private void openFile(Stage primaryStage) {FileChooser fileChooser = new FileChooser();fileChooser.setTitle("打开文件");fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("文件", "*.mp4","*.mp3","*.wav"));File file = fileChooser.showOpenDialog(null);if (file != null) {try {URI uri = Paths.get(file.getAbsolutePath()).toUri();Media media = new Media(uri.toString());if (mediaPlayer != null) {mediaPlayer.dispose();}mediaPlayer = new MediaPlayer(media);mediaView = new MediaView(mediaPlayer);String mediaTitle = "player - " + file.getName();//((Stage) mediaView.getScene().getWindow()).setTitle(mediaTitle);primaryStage.setTitle(mediaTitle);} catch (MediaException e) {Alert alert = new Alert(Alert.AlertType.ERROR);alert.setTitle("错误");alert.setHeaderText("无法打开文件");alert.setContentText("打开文件时发生错误。");alert.showAndWait();}}}

3.实现后的效果如下:
在这里插入图片描述
在这里插入图片描述
完整代码如下:
javaFX实现视频播放源码


http://www.mrgr.cn/news/30574.html

相关文章:

  • SPI接口通信协议浅谈成都自动化开发
  • yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】
  • Linux 后台运行服务的全攻略:nohup、screen、tmux 和 systemd 的实战指南
  • (笔记)mac笔记本调节键盘速率
  • 【大模型开发】 迎接AI新时代:Qwen2.5发布,超越LLaMA3!本地私有化部署:如何通过一键API调用不同模型?(附源码地址)
  • C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
  • 前端框架对比和选择
  • 6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
  • chapter16-坦克大战【1】——(自定义泛型)——day21
  • JZ2440开发板——S3C2440的存储控制器
  • C++ prime plus-3-编程练习
  • C++标准的一些特性记录:C++11的auto和decltype
  • 每天五分钟深度学习框架pytorch:pytorch中已经定义好的损失函数
  • 【洛谷】P1546 [USACO3.1] 最短网络 Agri-Net 的题解
  • 倍增练习(1)
  • pg入门3—详解tablespaces1
  • 恶意Bot流量识别分析实践
  • 计算机毕业设计 奖学金评定管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Python 入门教程(4)数据类型 | 4.6、列表
  • vulnhub靶机:Breach 2.1详细过程