无法使用JavaFX MediaPlayer播放视频

无法使用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

在我的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 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个问题:

  • 打印错误“错误\u媒体\u损坏:错误\u媒体\u损坏”
  • 未打印错误,但仅播放音频
  • 引发异常“MediaException:MEDIA\u不受支持:无法识别的文件签名!”

  • 检查媒体是否受支持:

    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提供了更高版本

    您可以通过执行以下操作来纠正此问题:

  • 安装libavcodec57、附加组件和dev
  • sudo-apt-get-install-libavcodec57

    sudo apt获得安装libavcodec额外

    sudo apt get安装libavcodec dev

    2.创建符号链接

    cd/usr/lib/x86_64-linux-gnu

    sudo ln-s libavcodec.so libavcodec.so.53


    当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);
        }