javafx实现视频播放器

Java大熊编程 Java大熊编程     2023-04-04     399

关键词:

对于很多Java开发小伙伴来说,不少童鞋都了解过JavaFX,但介于JavaFX的局限性,可能大多数Java开发者也不是很了解,因而在JavaFX中自然也就缺乏实战经验,但是有时候呢我们也想自己研发一些小程序,比如说前面文章中给大家提到的 图片浏览器 ,或者说音频浏览器、视频浏览器等,那今天小编就带大家走进视频浏览器的编程过程!

效果图如下:

要求:

  1. 背景主色为黑色;

  1. 视频上下居中,左右居中,并保持界面中最大化显示;

  1. 进度条控制播放进度;

  1. 音频大小可拖动音频进度条控制;

  1. 默认打开即播放,点击画面暂停,继续单击又开始播放。

难点分析:

  1. 通过Media指定播放视频文件,通过MediaPlayer实现播放控制;

  1. 使用BorderPane布局方式让视频横向和纵向都居中;

  1. 使用Slider绑定播放进度条事件动态显示播放进度;

  1. 设置高度宽度改变事件来重置容器宽度和高度。

细节优化点:

  1. 当全屏播放时,显示退出全屏,并且不显示头部标题,退出全屏时操作相反;

  1. 视频播放时需要根据视频播放时长自动计算播放时长;

  1. ESC退出全屏播放。

好啦,废话不多说,那我们接下来就用代码来实现看看效果吧。

代码如下:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
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.TextAlignment;
import javafx.stage.Stage;
import javafx.util.Duration;

public class VideoPlayerApplication extends Application 
    private Stage primaryStage;
    private Label time = new Label();
    private double allTime = 0;
    private Slider playSlider;
    private Slider audioSlider = new Slider(0, 100, 80);
    private boolean isplay;
    private Media media;
    private MediaPlayer player;
    private String title;

    public VideoPlayerApplication() 
        // 默认初始化标题及其文件URL
        this.title = "测试";
        this.media = new Media("http://192.168.18.9:8080/files/20230313/9c49403b-929b-4f65-843b-4c122432b90d.mp4");
    

    public VideoPlayerApplication(String title, String url) 
        this.media = new Media(url);
        this.title = title;
    

    @Override
    public void start(Stage primaryStage) 
        this.primaryStage = primaryStage;
        player = new MediaPlayer(media);
        player.play();
        isplay = true;
        MediaView mediaView = new MediaView(player);

        VBox anchorPane = new VBox(mediaView);
        anchorPane.setAlignment(Pos.CENTER);
        anchorPane.setPrefWidth(800);
        anchorPane.setPrefHeight(600);
        anchorPane.setStyle("-fx-background-color: #000;");
        BorderPane root = new BorderPane(anchorPane);

        root.setPrefWidth(800);
        root.setPrefHeight(600);
        player.volumeProperty().bind(audioSlider.valueProperty().divide(100));

        root.setOnMouseClicked(event -> 
            playOrStop();
        );

        playSlider = new Slider();
        playSlider.setMin(0);
        playSlider.setMax(500);
        playSlider.setPrefWidth(800);
        playSlider.setValue(0);

        VBox.setMargin(playSlider, new Insets(-50, 0, 0, 0));
        anchorPane.getChildren().add(playSlider);
        Label full = new Label("全屏");
        full.setOnMouseClicked(event -> 
            fullScreen(full);
        );
        Label label = new Label(">");
        label.setTextAlignment(TextAlignment.CENTER);
        label.setAlignment(Pos.CENTER);
        label.setPrefWidth(650);
        label.setMinWidth(80);
        Label vol = new Label("音量");
        vol.setStyle("-fx-text-fill:white");

        audioSlider.setMaxWidth(80);
        audioSlider.setMinWidth(30);
//        audioSlider.setRotate(-90);
        HBox hBox = new HBox(full, label, vol, audioSlider);
        hBox.setPadding(new Insets(20, 0, 0, 0));
        anchorPane.getChildren().add(hBox);
        Scene scene = new Scene(root);
        primaryStage.setTitle(title);
        primaryStage.setScene(scene);
        primaryStage.show();
        player.currentTimeProperty().addListener((x, y, z) -> 
            if (isplay) 
                double currents = player.getCurrentTime().toSeconds();
                allTime = player.getStopTime().toSeconds();
                playSlider.setValue(currents / allTime * 500);
                time.setText(formattime(currents, allTime, 0));
            
        );

        playSlider.setOnMousePressed(x -> 
            isplay = false;
        );
        playSlider.setOnMouseReleased(x -> 
            player.seek(Duration.seconds(playSlider.getValue() / 500 * allTime));
            isplay = true;
        );
        ChangeListener<Number> changeListener = (event, oldVal, newVal) -> 
            System.out.println("oldVal = " + oldVal + ", newVal = " + newVal);
            mediaView.setFitHeight(primaryStage.getHeight() - 40);
            mediaView.setFitWidth(primaryStage.getWidth());
        ;
        primaryStage.widthProperty().addListener(changeListener);
        primaryStage.heightProperty().addListener(changeListener);
        primaryStage.fullScreenProperty().addListener((event, q, d) -> 
            fullScreen(full);
        );

        root.setOnKeyPressed(event -> 
            System.out.println(event.getCode());
            if (KeyCode.SPACE.equals(event.getCode())) 
                playOrStop();
            
        );

        primaryStage.setOnCloseRequest(event -> 
            player.pause();
            player.stop();
        );

        mediaView.setFitHeight(primaryStage.getHeight() - 40);
        mediaView.setFitWidth(primaryStage.getWidth());
    

    private void playOrStop() 
        if (isplay) 
            isplay = false;
            player.pause();
         else 
            Duration seconds = Duration.seconds(playSlider.getValue() / 500 * allTime);
            player.seek(seconds);
            isplay = true;
            player.play();
        
    

    private void fullScreen(Label full) 
        if ("全屏".equals(full.getText())) 
            primaryStage.setFullScreen(true);
            audioSlider.setVisible(false);
            playSlider.setVisible(false);
            full.setText("退出全屏");
         else 
            primaryStage.setFullScreen(false);
            audioSlider.setVisible(true);
            playSlider.setVisible(true);
            full.setText("全屏");
        
    

    public static String formattime(double this_time, double all_time, int type) 
        String thistime = String.format("%02d:%02d:%02d", (int) this_time / 3600, (int) this_time % 3600 / 60, (int) this_time % 60);
        String alltime = String.format("%02d:%02d:%02d", (int) all_time / 3600, (int) all_time % 3600 / 60, (int) all_time % 60);
        return type == 1 ? thistime : type == 2 ? alltime : thistime + "/" + alltime;
    

有了这个基础,我们是不是可以自己做一个视频播放器呢,那答案一定是肯定的,但是如果是支持缩放,也就是说界面大小可以由用户自由缩放,这样的话处理起来会复杂的多,如果有想法的话,建议固定默认播放界面大小(但是全屏一定得支持,不然用户体验及其不友好),剩余的大家可以自由探索,如果是编程过程中有碰到问题的,随时可以私信我。

好啦,今天课程就到此结束,下课!

在 JavaFX 2 中播放带字幕的视频

】在JavaFX2中播放带字幕的视频【英文标题】:PlayvideowithsubtitlesinJavaFX2【发布时间】:2012-11-0214:29:28【问题描述】:我注意到JavaFX1有一个SubtitleTrack类用于从视频文件中提取字幕,但我在JavaFX2中找不到等效功能(javafx.scene.media中... 查看详情

在JavaFX中播放带字幕的视频[重复]

】在JavaFX中播放带字幕的视频[重复]【英文标题】:PlayvideowithsubtitlesinJavaFX[duplicate]【发布时间】:2020-01-1607:23:14【问题描述】:是否可以在包含.srt字幕的JavaFX中播放视频?我的意思是实际获取字幕轨道并将其显示为GUI中的普通... 查看详情

javafx媒体可以播放mp4格式的视频文件吗?(代码片段)

我正在尝试使用javafx媒体播放视频。但是我无法在本地机器视频中播放视频。我尝试使用默认的AdvancedMedia.java文件javafxEnsemble.jar文件。我复制了相同的文件代码并粘贴在我的Eclipse中。在那里也玩了几秒钟和弯腰。几秒钟。但如... 查看详情

在 JavaFX Web 浏览器中集成 Flash 播放器

】在JavaFXWeb浏览器中集成Flash播放器【英文标题】:IntegratingflashplayerinJavaFXwebbrowser【发布时间】:2013-08-1902:14:19【问题描述】:我使用JavaFX的WebView和WebEngine类创建了一个Web浏览器。它工作正常,但无法播放视频。它正在打开youtu... 查看详情

JavaFX:MediaPlayer 无法播放电影

】JavaFX:MediaPlayer无法播放电影【英文标题】:JavaFX:MediaPlayercannotplaythemovie【发布时间】:2013-01-1615:23:01【问题描述】:我正在尝试我的第一个MediaPlayerjavafx应用程序。我遵循了很多方法,但我仍然无法在新应用程序上运行视频... 查看详情

初学了一段时间java。想做一个应用程序,程序只需要播放一个本地视频,mp4格式,求教怎么做

...教程也行,只需要完成以上条件。。十分感谢,急求使用javafx的Media,MediaPlayer,MediaView。代码如下:import java.io.File;import javafx.application.Application;import javafx.beans.binding.Bindings;import javafx.beans.property.ReadOnlyProperty;import... 查看详情

JavaFx 将文件拖放到程序中

...位置拖动文件并将其放入程序窗口.我正在创建一个媒体播放器,我希望能够通过将MP4拖放到窗口中来播放视频。我是否需要将文件存储在变量中,或者只是将文件的位置存储到变量中 查看详情

javafx中的2d相机?

我正在JavaFX中创建一个自上而下的游戏,但是我在使用随播放器移动的Camera的实现方面遇到了麻烦。我尝试创造这样的东西的目的不是移动玩家,而是按照玩家想要的相反方向移动场景。这造成了玩家移动的错觉,但它需要场景... 查看详情

[simpleplayer]实现一个简单的播放器

简单的播放器需要实现一个最基本的功能:播放视频文件。实现这个功能需要包含以下几个步骤:从视频文件中提取视频图像在屏幕上显示视频图像视频帧的同步,也就是保证视频图像在合适的时间在屏幕上显示从视频文件中提... 查看详情

关闭阶段JavaFX后如何停止WebEngine?

】关闭阶段JavaFX后如何停止WebEngine?【英文标题】:HowtostopWebEngineafterclosingstageJavaFX?【发布时间】:2014-04-2114:29:08【问题描述】:当我使用WebEngine创建新阶段以播放来自YouTube的视频时,在我关闭它后-Youtube继续在背景上播放。如... 查看详情

:音视频同步实现视频播放器

实现思路:三个线程,两个队列采用生产者消费者的模式首先定义一个结构体来存储全局的数据typedefstruct_PlayerPlayer;typedefstruct_DecoderDataDecoderData;struct_PlayerJavaVM*javaVM;AVFormatContext*input_format_ctx;//音频视频流索引位置intvideo_ 查看详情

avplayer自定制视频播放器——视频播放器基本实现(代码片段)

在iOS多媒体开发的过程中,经常会用到视频播放器,简单是视频播放器,直接使用苹果封装好的MPMoviePlayerController和MPMoviePlayerViewController就可以实现视频播放功能了,但是,多数情况下,都需要自定制视频... 查看详情

videojs实现点击按钮播放切换视频

先说一下啊!!博主并不会videoJs,只是使用其实现视频播放功能;不能解决好友的其他需求,请见谅!!! 链接是videoJs实现视频播放需要的js和css:链接:https://pan.baidu.com/s/1geLvRUz密码:ujix 查看详情

ffmpeg+win32实现视频播放器

转自:https://www.cnblogs.com/judgeou/p/14724951.html 查看详情

使用ffmpeg实现单线程异步的视频播放器(代码片段)

自定义播放器系列第一章视频渲染第二章音频(push)播放第三章音频(pull)播放第四章实现时钟同步第五章实现通用时钟同步第六章实现播放器(本章)文章目录自定义播放器系列前言一、播放流程二、... 查看详情

android主流视频播放及缓存实现原理调研

...视频播放及缓存方案进行调研,对于Android端常用的视频播放器的缓存策略介绍及实现原理。实现简单,逻辑易懂。在播放器与视频源服务器之间加了一层代理服务器,截取视频播放器发送的请求,根据截取的请求,向网络服务... 查看详情

androidjni实战——记录实现视频播放器(代码片段)

...、实现工具FFmpeg负责解码GLES+GLSurfaceView负责渲染二、播放器实现流程图1.总流程image2.FFmpeg解码流程:by雷霄骅3.FFmpeg解码具体流程:创建封装格式上下文打开输入文件,解封装获取音视频流信息获取音视频流索引获取解码器参... 查看详情

如何在收藏视图中实现视频播放?

】如何在收藏视图中实现视频播放?【英文标题】:howtoimplementvideoplaybackinthecollectionview?【发布时间】:2021-03-2304:50:40【问题描述】:我想开发一个演示应用程序,以在集合视图单元格上显示视频和图像,就像Instagram帖子或thislin... 查看详情