在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);}
}
以下是测试播放演示效果图: