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