自学内容网 自学内容网

【多媒体】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);
}
}

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


原文地址:https://blog.csdn.net/weixin_42369079/article/details/140303079

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!