JavaFX实现视频播放功能

news2024/9/20 1:07:34

一、前言
最近使用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);
	}

	@Override
	public 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.coloradmin.cn/o/2147472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LAN8720A-CP-TR-ABC QFN-24 以太网收发器芯片

功能: 高性能收发器:支持10BASE-T和100BASE-TX标准,能够自动协商最佳速度和双工模式。 小尺寸:是业界尺寸最小的解决方案,适合空间受限的应用场景。 低功耗:功耗比现有的Microchip收发器低40%&#x…

【Unity】URP Rendering总结

unity-urp-rendering 介绍 个人学习总结,不定期更新 仓库 Unity版本:2022.3.42 Unity URP渲染管线下相关的渲染demo和总结 1. GPUInstance 1.1 Graphics.DrawMeshInstanced 1.2 Graphics.DrawMeshInstancedIndirect 1.3 MeshRenderer.SetPropertyBlock…

MTK芯片机型的“工程固件” 红米note9 5G版资源预览 写入以及改写参数相关步骤解析

小米机型:小米5 小米5x 米6 米6x 米8 米9 米10系列 米11系列 米12系列 mix mix2 mix2s mix3 max max2 max3 note3 8se 9se cc9系列 米play 平板系列等分享 红米机型:红米note4 红米note4x 红米note5 红米note6 红米note7 红米note8 红米note8pro 红米s2 红米note7pro 红米…

【C++算法】模拟算法

替换所有的问号 题目链接 替换所有的问号https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/description/ 算法原理 代码步骤 class Solution { public:string modifyString(string s) {int n s.size();for(int i 0; i < n; i){…

网络药理学:15、草稿暂存区

TCMSP 韦恩图在线网站 https://bioinfogp.cnb.csic.es/tools/venny/index.html String数据库参数详解&#xff1a;https://www.bilibili.com/video/BV1q64y1k7Zf?p16&vd_sourceaed4c634975918b14b7354ec93ce5389 David数据库可以用基因ID或者基因名。 KEGG数据库使用&am…

高效处理NPE!!

相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止 NPE&#xff0c;是程序员的基本修养。”但是修养归修养&#xff0c;也是我们程序员最头疼的问题之一&#xff0c;那么我们今天就要尽可能的利用Java8的新特性 Optional来…

视觉语言大模型模型介绍-CLIP学习

多模态学习领域通过结合图像和文本信息&#xff0c;为各种视觉语言任务提供了强大的支持。图像和文本的结合在人工智能领域具有重要的意义&#xff0c;它使得机器能够更全面地理解人类的交流方式。通过这种结合&#xff0c;模型能够处理包括图像描述、视觉问答、特征提取和图像…

Maya动画基础

Maya动画基础教程&#xff08;完整&#xff09;_哔哩哔哩_bilibili 第一集 动画基础设置 altv播放动画 选择撕下副本 右键---播放预览 第二集 k帧记录物体的空间信息 初始位置清零 删除历史记录 s键key帧 自动记录位置信息 删除帧&#xff0c;按住右键选择delete 按shif…

Apache subversion 编译流程

目录 1. 概述2. 依赖库简介2.1 Expat2.2 Apache apr2.3 Apache apr-iconv2.4 Apache apr-util2.5 Zlib2.6 OpenSSL2.7 Sqlite2.8 Apache Serf2.9 Apache subversion3. 编译3.1 Expat编译3.1.1 源码信息3.1.2 CMake-GUI3.1.3 编译步骤3.2 APR编译3.2.1 源码信息3.2.2 编译步骤3.…

详解c++菱形继承和多态---下

菱形继承 #include<iostream>using namespace std; class Animal { public:int m_Age; }; class Sheep : public Animal {}; class Tuo : public Animal {}; class SheepTuo : public Sheep, public Tuo {}; void test() {SheepTuo st;st.Sheep::m_Age 18;st.Tuo::m_Age…

数据结构-3.1.栈的基本概念

一.栈的定义&#xff1a; 栈和线性表的区别&#xff1a;栈只能在表尾一端进行插入或者删除的操作&#xff0c;而线性表可以在任意一个地方进行插入或者删除 二.有关栈的关键术语&#xff1a; 三.栈的基本操作&#xff1a; 1.回顾线性表的基本操作&#xff1a; 2.栈的基本操作&…

vue使用vue-i18n实现国际化

我使用的是vue2.6版本&#xff0c;具体使用其他版本可以进行修改 一、安装 npm install vue-i18n -D 二、配置 1、文件配置 ①在src下创建 i18n 目录 ②在 i18n 目录下创建 langs 文件夹 和 index.js文件&#xff0c;具体如下 2、index.js代码如下&#xff0c;这里使用了…

【分立元件】案例:新人加了个TVS管为什么可能导致系统不能正常工作

因为最近在带多个新人,让其设计原理图和PCB总会发现各种电路问题点。比如TVS管接法问题。 TVS是一种限压型的过压保护器,它将过高的电压钳制至一个安全范围,藉以保护后面的电路,有着比其它保护元件更快的反应时间,这使TVS可用在防护lighting、switching、ESD等快速破坏性瞬…

计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】

1.复制函数--------------strcpy函数 函数使用 char*strcpy&#xff08;char* destination, const char* source&#xff09; strcpy函数用于拷贝字符串&#xff0c;即将一个字符串中的内容拷贝到另一个字符串中&#xff08;会覆盖原字符串内容&#xff09;。它的参数是两个指…

TIOBE 编程指数 9 月排行榜公布 VB.Net第七

原文地址&#xff1a;百度安全验证 IT之家 9 月 8 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 9 月的编程语言排行榜&#xf…

Element走马灯组件循环播放两个页面是方向不一致

摘要&#xff1a;使用Carousel 走马灯循环播放同一类型的图片、文字等内容&#xff0c;会在循环内容为两组是出现下图 [1]中的现象。本文记录下如何解决 之前项目遇到过一次这个问题&#xff0c;由于indicator-position 指示器不用显示&#xff0c;则判断内容长度为2时&#xf…

恶意Bot流量识别分析实践

1、摘要 随着互联网的发展&#xff0c;自动化工具和脚本&#xff08;Bots&#xff09;的使用越来越普遍。虽然一些善意 Bots 对于网站的正常运行和数据采集至关重要&#xff0c;但恶意 Bots 可能会对网站带来负面影响&#xff0c;如爬取敏感信息、恶意注册、刷流量等。因此&am…

saltstack配置管理

一、saltstack的SSH工作模式 一、salt-ssh介绍 salt-ssh 是 0.17.0 新引入的一个功能&#xff0c;不需要minion对客户端进行管理&#xff0c;也不需要master。salt-ssh 支持salt大部分的功能&#xff1a;如 grains、modules、state 等salt-ssh 没有使用ZeroMQ的通信架构&#…

向日葵好用吗?4款稳定的远程控制软件推荐。

远程控制技术现在已经被应用于很多个领域&#xff0c;像企业办公&#xff0c;远程协助&#xff0c;智能家居&#xff0c;工业控制等等。我们常常会用到的时前两种。而实现远程控制的方式也有多种&#xff0c;但是最方便高效的还是使用第三方软件。我最常使用的是向日葵&#xf…