【多媒体】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";@Overridepublic 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>() {@Overridepublic void handle(ActionEvent event) {// 创建一个文件选择器FileChooser fileChooser = new FileChooser();fileChooser.setTitle("打开文件");// 显示文件选择器,并获取选中的文件(如果有)fileChooser.showOpenMultipleDialog(primaryStage);}});// 为菜单项添加事件处理器openFile.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic 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);}
}

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

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

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

相关文章

websockt初始化,创建一个webSocket示例

写文思路&#xff1a; 以下主要从几个方面着手写websocket相关&#xff0c;包括以下&#xff1a;什么是webSocket&#xff0c;webSocket的优点和劣势&#xff0c;webSocket工作原理&#xff0c;webSocket握手示例&#xff0c;如何使用webSocket(使用webSocket的一个示例)&#…

2024中国大学专业排名:生态、地理、草业、林学、资环

生态学、林学、地理科学、草业科学、农业资源与环境、大气科学、农学、地球化学、水土保持与荒漠化防治、自然地理与资源环境、地理信息科学、应用气象学共12个专业。 一、生态学 二、林学 三、地理科学 四、草业科学 五、农业资源与环境 六、大气科学 七、农学 八、地球化学 九…

【《无主之地3》风格角色渲染在Unity URP下的实现_角色渲染(第四篇) 】

文章目录 概要描边问题外秒变分叉解决办法1:测试效果如下:外秒变分叉解决办法2:URP管线下PBR渲染源码关键词解释:完整shader代码如下:URP管线下二次元皮肤渲染源码URP管线下二次元头发渲染源码简要介绍文章的目的、主要内容和读者将获得的知识。 概要 提示:《无主之地3》…

希喂、鲜朗和牧野奇迹主食冻干怎么样?第一次喂冻干哪款更好

我是个宠物医生&#xff0c;每天很长时间都在跟猫猫狗狗打交道&#xff0c;送到店里来的猫猫状态几乎是一眼就能看出来&#xff0c;肥胖、肝损伤真是现在大部分家养猫正面临的&#xff0c;靠送医治疗只能减缓无法根治&#xff0c;根本在于铲屎官的喂养方式。 从业这几年&#…

SuperMap GIS基础产品FAQ集锦(20240709)

一、SuperMap iDesktopX 问题1&#xff1a;请问针对iDesktopX地质体建模功能的数据组织格式相关问题请教哪位同事? 11.1.1 【解决办法】“地质体构建”功能可依据多个地质点数据集实现对地质体的构建&#xff0c;构建地质体中点图层的顺序对应实际地层由高到低。可参考官方博…

全能型CAE/CFD建模工具SimLab 详解Part1: Geomtry,轻松集成力学、电磁学、疲劳优化等功能

SimLab的建模功能 SimLab集成了结构力学&#xff0c;流体力学&#xff0c;电磁学&#xff0c;疲劳和优化等功能&#xff0c;是全能型的CAE / CFD建模工具。 具有强大的几何、网格编辑功能&#xff0c;能够快速的清理复杂模型&#xff0c;减少手动修复的工作量&#xff0c;提高…

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…

linux宝塔负载状态100%解决办法

宝塔面板负载状态显示100% 接着使用top命令查看了一下&#xff0c;发现cpu利用率很低&#xff0c;load却很高 通过使用 ps -axjf命令查看是否存在D状态进程 D 状态是指不可中断的睡眠状态&#xff0c;该状态的进程无法被 kill&#xff0c;也无法自行退出&#xff0c;只能通过恢…

使用各向异性滤波器和图像处理方法进行脑肿瘤检测(MATLAB)

医学图像分割一直以来都是计算机辅助诊断领域的研究热点。在医学图像的处理和分析中&#xff0c;对图像中感兴趣区域的准确分割尤其关键。要对感兴趣区域进行分类识别&#xff0c;首先要从图像中把感兴趣区域精确分割出来&#xff0c;然后有针对性地对感兴趣区域提取特征并分类…

植物大战僵尸杂交版全新版v2.2解决无法打开问题和全屏问题

解决无法打开问题 如我的电脑是windows11的系统。 1.打开windows安全中心&#xff0c;点击病毒和威胁防护。 如图&#xff1a; 2.点击管理设置。 3.把实时保护给关掉&#xff0c;就行了。 如图&#xff1a; 然后就可以打开了。 解决无法全屏的问题 1.右键植物大战僵尸的快捷…

如何在OpenFOAM的案例文件夹中确定数据的点和面,确定点和网格之间的关系,从而用于深度学习预测和构建模型呢(分析数据格式及其含义)

在OpenFOAM中&#xff0c;点&#xff08;points&#xff09;和面&#xff08;faces&#xff09;的定义是通过不同的文件来进行的。在案例一级目录下面的constant/polyMesh目录下&#xff0c;会有points, faces, owner, neighbour等文件&#xff0c;来描述网格的几何和拓扑结构。…

收银系统源码-消息通知功能解析

智慧新零售收银系统是一套线下线上一体化收银系统&#xff0c;给商户提供含线下收银称重、线上商城、精细化会员管理、ERP进销存、丰富营销活动、移动店务助手等一体化的解决方案。 功能详情见下文&#xff1a; 门店收银系统源码-CSDN博客文章浏览阅读2.6k次&#xff0c;点赞…

【深度学习】图形模型基础(5):线性回归模型第五部分:多变量线性回归模型

1.引言 当我们从基础的线性模型 y a b x error y a bx \text{error} yabxerror 转向更复杂的模型 y β 0 β 1 x 1 β 2 x 2 … error y \beta_0 \beta_1 x_1 \beta_2 x_2 \ldots \text{error} yβ0​β1​x1​β2​x2​…error 时&#xff0c;我们面临了诸多…

3. kvm虚拟网络

kvm虚拟网络 一、虚拟网卡1、虚拟网卡驱动2、添加网卡3、删除网卡 二、虚拟网络1、NAT模式1.1 SNAT 1.2 DNAT 端口映射2、桥接bridge模式 一、虚拟网卡 1、虚拟网卡驱动 2、添加网卡 [rootmartin-host ~]# virsh attach-interface vm01_centos79 --type network --model virt…

书生大模型实战营(暑假场)-入门岛-第一关

书生大模型实战营暑假场重磅开启&#xff01;&#xff0c;这场学习路线看起来很好玩呀&#xff0c;闯关学习既能学到知识又有免费算力可得&#xff0c;太良心啦。感兴趣的小伙伴赶快一起报名学习吧&#xff01;&#xff01;&#xff01; 关卡任务 好的&#xff0c;我们废话不多…

Java基础语法--基本数据类型

Java基础语法–基本数据类型 Java是一种静态类型语言&#xff0c;这意味着每个变量在使用前都必须声明其数据类型。Java提供了多种基本数据类型&#xff0c;用于存储整数、浮点数、字符和布尔值等。以下是Java中的基本数据类型及其特点&#xff1a; 1. 整型&#xff08;Integ…

Qt常用基础控件总结—旋转框部件(QSpinBox类和QDoubleSpinBox类)

旋转框(微调按钮)部件 QAbstractSpinBox 类 QAbstractSpinBox 类介绍 QAbstractSpinBox 类是 QWidget 类的直接子类,虽然该类不是抽象类,但该类并未提供实际的功能,仅为旋转框提供了一些外观的形式以及需要子类实现了成员,也就是说点击微调按钮的上/下按钮,不会使其中的…

一键式创建GTest TDD测试平台

适用于C GTest测试平台搭建。直接上python脚本。 #!/usr/bin/env python3 # -*- coding: utf-8 -*-import argparse import os import platform import subprocess from xml.etree import ElementTree as ETdefault_root_path "d:\\test\\UTtest"class DeveloperTe…

常用Dos命令

学过Linux的shell命令的就很好理解&#xff0c;dos命令就是windows系统里面的命令&#xff0c;但是我们很少用&#xff0c;因为有图形化的界面&#xff0c;譬如&#xff1a;可以直接点击创建文件&#xff0c;在文件里面写东西&#xff0c;当然也可以通过终端执行命令创建文件&a…