【问题标题】:Create player (which doesn't play file)创建播放器(不播放文件)
【发布时间】:2015-05-23 17:30:15
【问题描述】:

我有一个创建视频播放器的类(代码附在下面),这个类只适用于视频文件。我想显示没有视频文件的播放器,当我通过公共方法“setFile”发送到对象时,它将开始播放。

我尝试向此类发送“null”而不是文件,但出现错误(“java.lang.NullPointerException”)。

VideoPlayer player = new VideoPlayer(null, videoWidth, videoHeight);

还有错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda$51/1323468230.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: uri.getScheme() == null! uri == ''
    at com.sun.media.jfxmedia.locator.Locator.<init>(Unknown Source)
    at javafx.scene.media.Media.<init>(Unknown Source)
    at v04.VideoPlayer.setFile(VideoPlayer.java:90)
    at v04.VideoPlayer.<init>(VideoPlayer.java:40)
    at v04.MainFrame.setVideoPlayer(MainFrame.java:218)
    at v04.MainFrame.createVideoPane(MainFrame.java:246)
    at v04.MainFrame.start(MainFrame.java:112)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda$54/539248128.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/186276003.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$49/1850153616.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/237061348.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$37/2117255219.run(Unknown Source)

我也尝试创建 Media 没有文件:(同样的错误)

media = new Media(videoFile.toURI().toString());
mediaPlayer = new MediaPlayer(null);
mediaView = new MediaView(mediaPlayer);

班级:

import java.io.File;

import javafx.beans.property.DoubleProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.util.Duration;

public class VideoPlayer extends GridPane  {

    File videoFile;
    Media media;
    MediaPlayer mediaPlayer;
    MediaView mediaView;

    DoubleProperty width;
    DoubleProperty height;

    VideoPlayer(File file, double width, double height) {

        setHgap(10);
        setVgap(10);
        setPadding(new Insets(10, 10, 10, 10));

        setFile(file);
        mediaView.setFitHeight(height*0.80);
        mediaView.setFitWidth(width*0.80);
        mediaView.setPreserveRatio(true);


        add(mediaView, 1, 0); 
        add(setSlider(),1,1);

    }

    public HBox setSlider() {

        // Play and pause button
        Button playButton = new Button("Play");
        playButton.setOnAction(e -> {
            if (playButton.getText().equals("Play")) {
                mediaPlayer.play();
                playButton.setText("pause");
            } else {
                mediaPlayer.pause();
                playButton.setText("Play");
            }
        });


        // Rewind button
        Button rewindButton = new Button("rewind");
        rewindButton.setOnAction(e -> mediaPlayer.seek(Duration.ZERO));

        // Slieder for volume
        Slider slVolume = new Slider();
        slVolume.setPrefWidth(150);
        slVolume.setMaxWidth(Region.USE_PREF_SIZE);
        slVolume.setMinWidth(30);
        slVolume.setValue(50);
        mediaPlayer.volumeProperty().bind(slVolume.valueProperty().divide(100));
        HBox hBox = new HBox(10);
        hBox.setAlignment(Pos.CENTER);
        hBox.getChildren().addAll(playButton, rewindButton,
                new Label("Volume"), slVolume);
        return hBox;
    }

    public void setFile(File file) {

        videoFile=file;
        videoFile = file;
        media = new Media(videoFile.toURI().toString());
        mediaPlayer = new MediaPlayer(media);
        mediaView = new MediaView(mediaPlayer);
        width = mediaView.fitWidthProperty();
        height = mediaView.fitHeightProperty();
    }

    public void playVideo() {
        mediaPlayer.play();
    }
}

【问题讨论】:

  • 由于您的英语问题(我的意思是无意冒犯),我无法理解您在问什么。你能试着重新表述一下,以便我理解吗?
  • @Water 我想在没有视频文件的情况下运行这个课程(只显示播放器!)。这个有可能?或者为玩家制作一个框架......
  • 你能发布你的空指针堆栈跟踪和/或告诉我有问题的行是什么吗?

标签: java javafx video media-player media


【解决方案1】:

当您将空参数传递给构造函数的第一个 arg 时,它会传递给 setFile,如下所示:setFile(null)

这个功能有:

public void setFile(File file) {
    videoFile = file;
    videoFile = file; // You are doing this twice? Is this an error on your part?
    media = new Media(videoFile.toURI().toString()); // This is where the null pointer is happening.
}

videoFile 为 null,您正在对 null 对象调用 toURI()

我不知道这是否会完全解决您的问题,但除非您更改代码 - 您需要像这样防范空值:

public void setFile(File file) {
    if (file == null)
        return;
    videoFile = file;
    media = new Media(videoFile.toURI().toString());
    mediaPlayer = new MediaPlayer(media);
    mediaView = new MediaView(mediaPlayer);
    width = mediaView.fitWidthProperty();
    height = mediaView.fitHeightProperty();
}

【讨论】:

  • 谢谢,但我想你不明白我的意思。我知道是什么导致了这个错误,我做了它来测试。无论如何,我通过视频文件为空时出现的黑色矩形解决了它。再次感谢!
  • 很抱歉,我无法提供更多帮助,不过很高兴您已修复它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多