无法使用JavaFX MediaPlayer播放视频
在我的fxml文件中,我有:无法使用JavaFX MediaPlayer播放视频,java,javafx,media-player,Java,Javafx,Media Player,在我的fxml文件中,我有: <AnchorPane prefHeight="500.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40"> <children> <Button layoutX="14.0" layoutY="461.0" mnemonicParsing="false" text="Dummy
<AnchorPane prefHeight="500.0" prefWidth="500.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40">
<children>
<Button layoutX="14.0" layoutY="461.0" mnemonicParsing="false" text="Dummy Button" />
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0" />
</children>
</AnchorPane>
显示虚拟按钮,以便正确加载布局。没有异常或错误,但仍然没有发生任何事情。我没有看到任何视频帧,没有播放任何内容。我在Windows7上运行该代码。我做错了什么
编辑:
代码没问题。只是并不是我所有的测试内容都得到支持。如下所示,最好检查玩家状态:
mediaPlayer.setOnError(()->System.out.println("media error"
+ mediaPlayer.getError().toString()));
到目前为止,我遇到了3个问题:
检查媒体是否受支持:
mediaPlayer.setOnError(()->
System.out.println("media error"+mediaPlayer.getError().toString()));
如果存在媒体异常
,例如不支持音频格式,则您将看不到视频,但应用程序将正常启动
请注意,您可以尝试另一种方法,将所有代码嵌入FXML文件中:
<MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0">
<mediaPlayer>
<MediaPlayer autoPlay="true">
<media>
<Media source="@video.mp4" />
</media>
</MediaPlayer>
</mediaPlayer>
</MediaView>
为了帮助他人,写下这个问题的答案。这可能会有帮助。 创建视频播放器时,不应重新初始化mediaView。如果要重新初始化mediaView,则mediaView将失去原始节点的引用。您只需将mediaPlayer设置为mediaView并检查mediaView的空引用。如果mediaView为空,则实例化它 参考下面的url并查看itachi给出的答案。 如果您没有使用FXML loader来实例化mediaView,那么下面的代码可能会起作用。它确实对我有用
private void playVideo(String fileLocation) {
System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
media = new Media(new File(fileLocation).toURI().toString());
mediaPlayer = new MediaPlayer(media);
// mediaPlayer.setAutoPlay(true);
if(mediaView == null) {
mediaView = new MediaView(mediaPlayer);
}
mediaView.setMediaPlayer(mediaPlayer);
mediaPlayer.play();
mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
setVideoMediaStatus(PLAYING);
pane.getChildren().add(mediaView);
}
在ubuntu 17.10中,libavcodec出现了一些问题。 javafx搜索libavcodec53,但ubuntu 17.10提供了更高版本 您可以通过执行以下操作来纠正此问题:
当javafx搜索libavcodec53时,我们现在指向libavcodec57。没有打印错误。当我这样做时:mediaPlayer.setOnReady(()->System.out.println(“media ready”);我看到媒体已经准备好了。嵌入FXML也不起作用。我对其他一些视频进行了实验,发现其中一个内容只播放声音(mediaPlayer没有返回任何错误)。其他完全不起作用(并且打印了不支持的介质)。第三个也不起作用,尽管引发了异常,所以不会打印错误。最后第四个打得很好,所以我觉得我的代码还可以。无论如何,谢谢你的回答,它帮助我找到了问题。
private void playVideo(String fileLocation) {
System.out.println("VideoProcesser Thread = " + Thread.currentThread().getName());
media = new Media(new File(fileLocation).toURI().toString());
mediaPlayer = new MediaPlayer(media);
// mediaPlayer.setAutoPlay(true);
if(mediaView == null) {
mediaView = new MediaView(mediaPlayer);
}
mediaView.setMediaPlayer(mediaPlayer);
mediaPlayer.play();
mediaPlayer.setOnError(() -> System.out.println("Current error: "+mediaPlayer.getError()));
setVideoMediaStatus(PLAYING);
pane.getChildren().add(mediaView);
}