2017-08-03 29 views
-3

我正尝试在Java中创建媒体播放器。 为了做到这一点,我传递了一个字符串在我的文件所在的地方,但我得到一个错误。在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); 
    } 
} 

该错误是在解析文件的字符串被显示。 我想我在定位我的文件路径时遇到了错误,无法找到解决方案。

+0

您的主目录中有一个名为'Users'的文件夹?这似乎不太可能。我不知道'Player'是什么,并且不知道这个问题是不是真的可以回答这个问题,但是JavaFX中的大多数方法都希望某种资源能够传递一个URL(或URL的字符串形式),而不是文件路径。 –

+1

〜是shell而不是Java。您必须使用完整路径或getenv $ HOME。或者,您可以使用“user.home”属性。 – mko

+0

@James_D我已添加播放器类代码,并在桌面上也有一个媒体文件的副本。 我需要路径来喂养字符串 – vidit02100

回答

1

您显然正在尝试将文件系统路径传递给Media构造函数。按照documentation

媒体类代表的媒体资源。它是从源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(); 

在另一方面,:

或更一般的,你可以用/,在这种情况下,它会搜索相对于classpath中启动的资源名称用户提供,你可以从一个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(); 
    // ... 
}