【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【更多功能的播放器】【音视频播放】

在Java中播放视频可以使用多种方案,最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过,JMF已经不再被推荐使用,而Xuggler是基于DirectX的,不适用于跨平台。而且上述方案都需要使用第三方库。

在JDK 8.0版本中,一个最简单的视频播放器跨平台解决方案是使用JavaFX,它提供了MediaPlayer类来播放视频。
JavaFX是一个用于创建富客户端应用程序的GUI框架,它提供了丰富的图形、多媒体和动画功能。在JavaFX中,我们可以使用简洁的代码来实现视频播放功能。
JavaFX 最初是由 Oracle 推出的一个用于开发富客户端的GUI框架,它旨在取代较旧的 Swing 框架。JavaFX 于 2007 年推出,2011 年 10 月发布了2.0 版本。JavaFX 2.0 的一个优点是适用于跨平台,而且可以完全用 Java 语言编写代码。

2014年发布的JDK 8.0就包含了JavaFx 2.0 版本。然而,随着时间的发展和技术的变迁,JavaFx 2.0并未达到预期目标,而且在与其他的技术标准竟争中处于下风。从 JDK 11 开始,Oracle 决定不再将 JavaFX 包含在 JDK 中,如有需要JavaFX必须单独下载和使用。
尽管如此,JavaFX 仍然是一个强大的开发工具,开发者可用它来设计、编写、测试、调试和部署富客户端程序,支持跨平台使用。

使用Java语言实现一个音视频播放器,支持播放各种常见视频格式,如MP4、Flv等;同时支持MP3和wav格式的音频。
这个视频可使用菜单来用文件选择器来选择视频文件进行播放。该播放器具备基本的播放控制功能,如播放、暂停、继续、关闭、全屏等,并且能够实现视频的全屏播放和音量控制。

以下是本例程的源代码:

/***
 * @author QiuGen
 * @description 用JavaFX实现音视频播放器MusicPlayer.java
 * 实现功能:这个视频使用菜单来用文件选择器来选择视频文件进行播放。
 * 该播放器具备基本的播放控制功能,如播放、暂停、继续、关闭、全屏
 * 等,并且能够实现视频的全屏播放和音量控制。
 * @date 2024/7/9
 * ***/
import java.io.File;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Separator;
import javafx.scene.control.Slider;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
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.Font;
import javafx.scene.text.Text;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class MusicPlayer extends Application {
	static double WIDTH = 800;
	static double HEIGHT = 680;
	private VBox rootBox = new VBox(3);
	private Stage primaryStage;
	private Media media;
	private MediaPlayer mediaPlayer;
	private MediaView mediaView;
	// 音频或视频的路径
	//private  String path;
	private static final String PATH = "D:/Temp/太极拳.mp4";
	//private static final String PATH = "D:/Temp/大约在冬季.mp3";
	//private static final String PATH = "D:/Temp/我是一片云.wav";
	//private static final String PATH = "D:/Temp/彩云飞.mp4";
	
	@Override
	public void start(Stage primaryStage) throws Exception {
		/***/
		// 创建媒体播放器
        media = new Media(new File(PATH).toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaView = new MediaView(mediaPlayer);

        setRootBox();
 
        Scene scene = new Scene(rootBox,WIDTH,HEIGHT);
        primaryStage.setTitle("音视频播放器");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
	
	private void setRootBox() {
        rootBox.getChildren().add(getTopHBox());
        rootBox.setAlignment(Pos.CENTER);

        rootBox.getChildren().add(mediaView);
        rootBox.setPrefWidth(WIDTH);
        rootBox.setPrefHeight(HEIGHT);
        mediaView.setFitWidth(rootBox.getPrefWidth());
        mediaView.setFitHeight(rootBox.getPrefHeight() - 80);
 
        rootBox.getChildren().add(new Separator());
        rootBox.getChildren().add(getTogBtnHBox());
	}
	
    private MenuBar getMenu()
    {
        MenuBar menuBar = new MenuBar();
        
        Menu menuFile = new Menu("文件");                
        Menu menuEdit = new Menu("编辑");
        Menu menuHelp = new Menu("帮助");        
        menuBar.getMenus().addAll(menuFile, menuEdit, menuHelp);
        
        
        // 创建一个菜单项
        MenuItem openFile = new MenuItem("打开文件");
 
        // 为菜单项添加事件处理器
        openFile.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // 创建一个文件选择器
                FileChooser fileChooser = new FileChooser();
                fileChooser.setTitle("打开文件");
                // 显示文件选择器,并获取选中的文件(如果有)
                fileChooser.showOpenMultipleDialog(primaryStage);
            }
        });
        
        // 为菜单项添加事件处理器
        openFile.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                // 创建一个文件选择器
                FileChooser fileChooser = new FileChooser();
                fileChooser.setTitle("打开文件");
                fileChooser.getExtensionFilters().addAll(
                        new FileChooser.ExtensionFilter("All Video Files", "*.mp4", "*.flv", "*.mp3", "*.wav"),
                        new FileChooser.ExtensionFilter("Mp4 Video Files", "*.mp4"),
                        new FileChooser.ExtensionFilter("Flv Video Files", "*.flv"),
                        new FileChooser.ExtensionFilter("Mp3 Audio Files", "*.mp3"),
                        new FileChooser.ExtensionFilter("Wav Audio Files", "*.wav")
                );
                // 显示文件选择器,并获取选中的文件(如果有)
                File file = fileChooser.showOpenDialog(primaryStage);
                if (file != null) {
                	media = new Media(file.toURI().toString());
                    mediaPlayer = new MediaPlayer(media);
                    // 创建媒体视图
                    mediaView = new MediaView(mediaPlayer);
                    mediaView.setFitWidth(WIDTH);
                    mediaView.setFitHeight(HEIGHT - 80);
                    rootBox.getChildren().clear();
                    setRootBox();
                    mediaPlayer.play();
                }
            }
        });
 
        // 将菜单项添加到菜单
        menuFile.getItems().add(openFile);
        
        return menuBar;
    }
    
    private HBox getTopHBox() {
    	HBox hbox = new HBox();
    	hbox.getChildren().addAll(getMenu(),getVolumeHBox());
    	return hbox;
    }
    /****/
    private HBox getVolumeHBox() {
    	HBox hBox = new HBox();
    	hBox.setAlignment(Pos.CENTER);
        // 创建“音量”微调滑块按钮
        Slider vSlider = new Slider(0, 1, 0.5); // 初始音量为50%
        vSlider.setPrefWidth(WIDTH*2/3);
        vSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
            mediaPlayer.setVolume(newValue.doubleValue());
        });
        hBox.getChildren().add(new Separator(Orientation.VERTICAL));
        hBox.getChildren().addAll(new Text("音量:"), vSlider); 
    	
    	return hBox;
    }
    /****/
    private HBox getTogBtnHBox()
    {
        int fontSize = 16;
        ToggleGroup toggleGroup = new ToggleGroup();
 
        ToggleButton playBtn = new ToggleButton("播放");
        playBtn.setFont(new Font(fontSize));
        playBtn.setOnMouseClicked(event -> mediaPlayer.play());
        playBtn.setToggleGroup(toggleGroup);
 
        ToggleButton suspendBtn = new ToggleButton("暂停");
        suspendBtn.setFont(new Font(fontSize));
        suspendBtn.setOnMouseClicked(event -> mediaPlayer.pause());
        suspendBtn.setToggleGroup(toggleGroup);
 
        ToggleButton continueBtn = new ToggleButton("继续");
        continueBtn.setFont(new Font(fontSize));
        continueBtn.setOnMouseClicked(event -> mediaPlayer.play());
        continueBtn.setToggleGroup(toggleGroup);
 
        ToggleButton closeBtn = new ToggleButton("结束");
        closeBtn.setFont(new Font(fontSize));
        closeBtn.setOnMouseClicked(event -> mediaPlayer.stop());
        closeBtn.setToggleGroup(toggleGroup);
        
        // 创建“全屏”按钮
        ToggleButton fScreenBtn = new ToggleButton("全屏");
        fScreenBtn.setFont(new Font(fontSize));
        fScreenBtn.setOnAction(e -> {
            Stage stage = (Stage) fScreenBtn.getScene().getWindow();
            stage.setFullScreen(true);
            mediaView.setFitWidth(stage.getWidth());
            mediaView.setFitHeight(stage.getHeight()); 
        });
        fScreenBtn.setToggleGroup(toggleGroup);
 
        HBox hBox = new HBox(3);
        hBox.setAlignment(Pos.CENTER);
        hBox.getChildren().addAll(playBtn, suspendBtn, continueBtn, closeBtn,fScreenBtn);  
 
        return hBox;
    }
    
    public static void main(String[] args) {
    	Application.launch(args);
	}
}

以下是测试播放演示效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/786955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统备份工具TimeShift

Linux系统备份 Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言1. 安装2. 启动3. 使用法一、图形界面操作&#xff08;方便&#xff09;法二、终端命令操作&#xff08;高端&#xff09; Linux系统备份工具TimeShift Linux系统备份工具TimeShift 0. 前言 Time…

SpringMVC--获取请求参数

1、通过的ServletAPI获取 只需要在控制器的方法的形参位置设置HTTPRequest request 类型的形参就i可以在控制器方法种使用request对象获取请求参数 RequestMapping("/servletAPI")public String getByServletAPI(HttpServletRequest request){HttpSession session…

【论文速读】| 用于安全漏洞防范的人工智能技术

本次分享论文&#xff1a;Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者&#xff1a;Steve Kommrusch 作者单位&#xff1a;Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 关键…

硬盘分区读不出来的危机与数据拯救指南

在数字时代&#xff0c;硬盘作为我们存储珍贵数据的“保险箱”&#xff0c;其稳定性和可访问性至关重要。然而&#xff0c;当硬盘分区突然读不出来时&#xff0c;这份安全感瞬间化为泡影&#xff0c;让人心急如焚。本文将深入探讨硬盘分区读不出来的原因、提供两种实用的数据恢…

物流工业三防平板实时跟踪货物位置和状态

在当今全球化和高度数字化的商业环境中&#xff0c;物流行业的高效运作对于企业的成功和经济的繁荣至关重要。货物的准确、实时跟踪不仅能提高物流效率&#xff0c;还能增强客户满意度&#xff0c;降低运营成本。物流工业三防平板的出现&#xff0c;为实现货物位置和状态的实时…

短剧新风潮:海外制作的艺术与技术

海外短剧新风潮在艺术与技术两个维度上都展现出了显著的创新与进步。 艺术层面 1、内容创新&#xff1a; &#xff08;1&#xff09;多元化与包容性&#xff1a;海外短剧在内容创新上更加注重多元化和包容性&#xff0c;将不同地域、民族的文化元素融入创作中&#xff0c;展现丰…

从资金到未来:技术融资如何重塑IT顾问在AI与网络安全的角色?

一方面是人工智能 &#xff08;AI&#xff09; 和机器学习 &#xff08;ML&#xff09; 的双引擎&#xff0c;另一方面是网络安全和数据泄露威胁中不断变化的威胁形势&#xff0c;IT 格局正在经历翻天覆地的变化。这场数字革命对 IT 顾问来说既是挑战也是机遇&#xff0c;但要成…

解读‘‘不要卷模型,要卷应用‘‘

前言 2024 年 7 月 4 日&#xff0c;世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海世博中心举行。百度创始人李彦宏在产业发展主论坛上发言&#xff0c;呼吁不要卷模型&#xff0c;要卷应用。 目录 四个要点 积极的观点 不合理性 总结 四个要点 李彦宏的呼吁…

【matlab】周期性信号分析

目录 信号预处理 周期性特征提取方法 频谱分析 傅里叶变换 快速傅里叶变换&#xff08;FFT&#xff09; 周期图法 Welch法 自相关分析 时频分析 基于模型的方法 时间序列分解 应用实例 提取信号的周期性特征是一个在信号处理领域广泛应用的技术&#xff0c;特别是在…

C#桌面应用开发:番茄定时器

C#桌面应用开发&#xff1a;番茄定时器 1、环境搭建和工程创建&#xff1a; 步骤一&#xff1a;安装visual studio2022 步骤二&#xff1a;新建工程 2、制作窗体部件 *踩过的坑&#xff1a; &#xff08;1&#xff09;找不到工具箱控件&#xff0c;现象如下&#xff1a;…

化妆品3D虚拟三维数字化营销展示更加生动、真实、高效!

随着人们越来越追求高速便捷的生活工作方式&#xff0c;企业在营销市场也偏国际化&#xff0c;借助VR全景制作技术&#xff0c;将企业1:1复刻到云端数字化世界&#xff0c;能带来高沉浸式的逼真、震撼效果。 通过我们独特的漫游点自然场景过渡技术&#xff0c;您将置身于一个真…

AWS无服务器 应用程序开发—第十七章 Application Composer

Application Composer 是 AWS 提供的一种可视化工具,用于设计和构建无服务器应用程序。它通过拖放界面简化了无服务器架构的创建过程,使开发者能够更直观地设计和配置应用程序的各个组件。 主要功能 可视化设计 通过拖放界面,开发者可以轻松地添加和配置 AWS 资源,如 L…

NVIDIA RTX 4090解析:卓越的性能表现带来全新的AI探索高度

前言 NVIDIA GeForce RTX 4090 在性能、效率和 AI 驱动的图形领域实现了质的飞跃。这款 GPU 采用 NVIDIA Ada Lovelace 架构&#xff0c;配备 24 GB 的 GDDR6X 显存。此外&#xff0c;RTX 4090还引入了多项创新技术。例如&#xff0c;它支持 DirectX12Ultimate&#xff0c;能够…

B站启用adblock插件导致无法看到评论

1 进入adblock插件的设置页面 2 进入自定义规则页面&#xff0c;编辑过滤规则 删除掉这一项 www.bilibili.com##P 然后&#xff0c;点击保存&#xff1b; 刷新页面就可以看到B站评论区的评论了。

[21] Opencv_CUDA应用之使用Haar级联的对象检测

Opencv_CUDA应用之使用Haar级联的对象检测 Haar级联使用矩形特征来检测对象,它使用不同大小的矩形来计算不同的线和边缘特征。矩形包含一些黑色和白色区域,如下图所示,它们在图像的不同位置居中 类Haar特征检测算法的思想是计算矩形内白色像素和黑色像素之间的差异这个方法的…

Mysql数据库两表连接进行各种操作

一&#xff0c;创建两个表emp和dept&#xff0c;并给它们插入数据 1.创建表emp create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; 2.创建表dept create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) cha…

音视频开发—FFmpeg处理流数据的基本概念详解

文章目录 多媒体文件的基本概念相关重要的结构体操作数据流的基本步骤1.解复用&#xff08;Demuxing&#xff09;2.获取流&#xff08;Stream&#xff09;3. 读取数据包&#xff08;Packet&#xff09;4. 释放资源&#xff08;Free Resources&#xff09;完整示例 多媒体文件的…

如何写出一篇高质量的新闻稿,纯干货

对于企业宣传来说&#xff0c;新闻稿的发布是常用的一种宣传推广的营销方式&#xff0c;新闻稿可以让消费者及时了解企业的最新发展动态&#xff0c;增加企业品牌的曝光度。 一篇高质量新闻稿不仅能作为品牌背书&#xff0c;还很可能会被各大媒体转载&#xff0c;短时间内提高企…

分类模型的算法性能评价

一、概述 分类模型是机器学习中一种最常见的问题模型&#xff0c;在许多问题场景中有着广泛的运用&#xff0c;是模式识别问题中一种主要的实现手段。分类问题概况起来就是&#xff0c;对一堆高度抽象了的样本&#xff0c;由经验标定了每个样本所属的实际类别&#xff0c;由特定…

【基于R语言群体遗传学】-11-二倍体适应性进化

之前的博客&#xff0c;我们讨论了正选择在单倍体中的情况&#xff0c;可以先学习之前的博客&#xff1a; 群体遗传学_tRNA做科研的博客-CSDN博客 分子适应的经典观点是正选择。对于一个新的突变在进化意义上起作用&#xff0c;它必须在罕见时通过选择增加。之前例子中有选择系…