我正在尝试用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时显示错误。 我想我在查找文件路径时遇到了错误,无法找到解决方案。
答案 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();
// ...
}