JavaFX实现视频播放功能

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

一、前言
最近使用javaFx写了个简朴的视频播放功能,可以实现打开本地视频播放。
二、实现
1.使用jdk8自带的javaFx包实现,首先定义一个类VideoPlayer。
代码如下:
  1. import javafx.application.Application;
  2. import javafx.application.Platform;
  3. import javafx.beans.InvalidationListener;
  4. import javafx.beans.property.Property;
  5. import javafx.beans.value.ChangeListener;
  6. import javafx.beans.value.ObservableValue;
  7. import javafx.geometry.Rectangle2D;
  8. import javafx.scene.Scene;
  9. import javafx.scene.control.*;
  10. import javafx.scene.image.Image;
  11. import javafx.scene.image.ImageView;
  12. import javafx.scene.layout.StackPane;
  13. import javafx.scene.media.Media;
  14. import javafx.scene.media.MediaException;
  15. import javafx.scene.media.MediaPlayer;
  16. import javafx.scene.media.MediaView;
  17. import javafx.stage.FileChooser;
  18. import javafx.stage.Screen;
  19. import javafx.stage.Stage;
  20. import javafx.util.Duration;
  21. import java.io.File;
  22. import java.net.MalformedURLException;
  23. import java.net.URI;
  24. import java.net.URISyntaxException;
  25. import java.nio.file.Paths;
  26. import java.util.concurrent.atomic.AtomicBoolean;
  27. public class VideoPlayer extends Application {
  28.         Button play,full,openFile;
  29.         MediaPlayer mediaPlayer;
  30.         MediaView mediaView;
  31.         public static void main(String[] args) {
  32.                 launch(args);
  33.         }
  34.         @Override
  35.         public void start(Stage primaryStage) throws MalformedURLException, URISyntaxException {
  36.                 openFile=new Button();
  37.                 openFile.setText("打开文件");
  38.                 openFile.setTranslateX(-300.0);
  39.                 openFile.setTranslateY(340.0);
  40.                 // 将MediaView加入到布局容器
  41.                 StackPane root = new StackPane();
  42.                 // 创建场景
  43.                 Scene scene = new Scene(root, 1000, 800);
  44.                 root.getChildren().add(openFile);
  45.                 primaryStage.setScene(scene);
  46.                 primaryStage.show();
  47.                 openFile.setOnMouseClicked(o->{
  48.                         mediaView = new MediaView(mediaPlayer);
  49.                         openFile(primaryStage);
  50.                         // 加载播放图像
  51.                         Image image = new Image(new File("image/play.png").toURI().toString());
  52.                         ImageView imageView = new ImageView(image);
  53.                         imageView.setFitHeight(45); // 设置图标大小
  54.                         imageView.setFitWidth(45);
  55.                         imageView.setPreserveRatio(true);
  56.                         full=new Button();
  57.                         play=new Button();
  58.                         play.setBackground(null);
  59.                         play.setTranslateX(0.0);
  60.                         play.setTranslateY(340.0);
  61.                         play.setGraphic(imageView);
  62.                         play.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
  63.                         // 创建MediaPlayer对象
  64.                         mediaPlayer.setAutoPlay(false); // 设置自动播放
  65.                         // 创建MediaView对象
  66.                         mediaView.setFitWidth(990);
  67.                         mediaView.setFitHeight(600);
  68.                         mediaView.setSmooth(true);
  69.                         // 将MediaView加入到布局容器
  70.                         root.getChildren().add(mediaView);
  71.                         root.getChildren().add(play);
  72.                         root.getChildren().add(full);
  73.                         // 创建场景
  74.                         scene.setOnMouseEntered(m->{
  75.                                 if (!primaryStage.isFullScreen()) {
  76.                                         play.setVisible(true);
  77.                                         full.setVisible(true);
  78.                                 }
  79.                         });
  80.                         scene.setOnMouseExited(m->{
  81.                                 if (!primaryStage.isFullScreen()) {
  82.                                         play.setVisible(false);
  83.                                         full.setVisible(false);
  84.                                 }
  85.                         });
  86.                         // 创建进度条
  87.                         ProgressBar progressBar = new ProgressBar(0);
  88.                         progressBar.setStyle("-fx-height: 8;");
  89.                         progressBar.setStyle("-fx-padding: -1;");
  90.                         Slider timeSlider = new Slider(0,0,0);
  91.                         // 当媒体元数据加载完成后,获取总播放时长
  92.                         mediaPlayer.setOnReady(() -> {
  93.                                 Duration totalDuration = mediaPlayer.getTotalDuration();
  94.                                 timeSlider.setMax(totalDuration.toSeconds());
  95.                                 progressBar.progressProperty().bind(timeSlider.valueProperty().divide(totalDuration.toSeconds()));
  96.                                 System.out.println("总播放时长: " + totalDuration.toSeconds() + " 秒");
  97.                         });
  98.                         mediaPlayer.setOnPlaying(() -> {
  99.                                 Platform.runLater(()->{
  100.                                         if (timeSlider.isFocused()) {
  101.                                                 return;
  102.                                         }
  103.                                         timeSlider.setValue(mediaPlayer.getCurrentTime().toSeconds());
  104.                                 });
  105.                         });
  106.                         timeSlider.setOnMouseReleased(e -> {
  107.                                 // 当拖动结束时更新进度条
  108.                                 timeSlider.setValue(mediaPlayer.getCurrentTime().toSeconds());
  109.                                 if (timeSlider.getValue()>=timeSlider.getMax()) {
  110.                                         play.setGraphic(imageView);
  111.                                 }
  112.                         });
  113.                         .........
  114.                        
复制代码
2.实现的打开文件功能。
  1. private void openFile(Stage primaryStage) {
  2.                 FileChooser fileChooser = new FileChooser();
  3.                 fileChooser.setTitle("打开文件");
  4.                 fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("文件", "*.mp4","*.mp3","*.wav"));
  5.                 File file = fileChooser.showOpenDialog(null);
  6.                 if (file != null) {
  7.                         try {
  8.                                 URI uri = Paths.get(file.getAbsolutePath()).toUri();
  9.                                 Media media = new Media(uri.toString());
  10.                                 if (mediaPlayer != null) {
  11.                                         mediaPlayer.dispose();
  12.                                 }
  13.                                 mediaPlayer = new MediaPlayer(media);
  14.                                 mediaView = new MediaView(mediaPlayer);
  15.                                 String mediaTitle = "player - " + file.getName();
  16.                                 //((Stage) mediaView.getScene().getWindow()).setTitle(mediaTitle);
  17.                                 primaryStage.setTitle(mediaTitle);
  18.                         } catch (MediaException e) {
  19.                                 Alert alert = new Alert(Alert.AlertType.ERROR);
  20.                                 alert.setTitle("错误");
  21.                                 alert.setHeaderText("无法打开文件");
  22.                                 alert.setContentText("打开文件时发生错误。");
  23.                                 alert.showAndWait();
  24.                         }
  25.                 }
  26.         }
复制代码
3.实现后的结果如下:


完整代码如下:
javaFX实现视频播放源码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表