在Java

时间:2017-08-03 18:55:16

标签: java javafx

我正在尝试用Java创建一个媒体播放器。 为了做到这一点,我传递了一个我文件所在的字符串,但是我收到了一个错误。

操作系统:MacOSX
IDE:Pycharm

@Override
public void start(Stage primaryStage) throws Exception{

    String file="~/Users/ViditShah/IdeaProjects/MediaPlayer/src/sample/1.mp4";
    Player player = new Player(file);
    Scene scene = new Scene(player,720,480, Color.BLACK);
    primaryStage.setScene(scene);
    primaryStage.show();

}

玩家等级:

public class Player extends BorderPane {
    Media media;
    MediaPlayer player;
    MediaView  view;
    Pane apane;
    Player(String file)
    {
        media =new Media(file);
        player = new MediaPlayer(media);
        view = new MediaView(player);

        apane.getChildren().add(view);

        setCenter(apane);
    }
}

解析文件String时显示错误。 我想我在查找文件路径时遇到了错误,无法找到解决方案。

1 个答案:

答案 0 :(得分:1)

您显然正在尝试将文件系统路径传递给Media构造函数。根据{{​​3}}:

  

Media类代表媒体资源。它是从源URI的字符串形式实例化的。

  

源必须表示有效的URI并且是不可变的。仅支持HTTP,FILE和JAR URL。如果提供的URL无效,则会抛出异常。

因此将文件系统路径传递给Media构造函数完全没有意义。你必须传递URI的字符串形式。

这里有两种不同的场景(由于某种原因,你拒绝澄清你想要做的事情)。要么您正在尝试播放作为应用程序一部分的视频,在这种情况下,视频将在部署时包含在应用程序的jar文件中,或者您尝试在运行时播放用户提供的视频。

在前一种情况下,您基本上需要从JVM加载类的任何地方加载视频(无论是文件系统,通常是在开发期间,还是从jar文件,通常在部署应用程序后)。为此,您可以从类加载器中获取URI。

如果视频与当前课程位于同一个包中,您可以执行以下操作:

String videoURI = getClass().getResource("1.mp4").toURI().toString();

并将其(通过您的Player构造函数)传递给Media构造函数。

或者更一般地说,您可以使用/启动资源名称,在这种情况下,它将相对于类路径进行搜索:

String videoURI = getClass().getResource("/sample/1.mp4").toURI().toString();

另一方面,如果您正在播放用户提供的视频,则可以从File对象创建URI:

File file = ... ;
String videoURI = file.toURI().toString();

例如,您可以这样做:

FileChooser chooser = new FileChooser();
chooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("mp4 video files", "*.mp4"));
File file = chooser.showOpenDialog(primaryStage);
if (file != null) {
    String videoURI = file.toURI().toString();
    // ...
}