无法使用JavaFX MediaPlayer播放视频

时间:2015-05-17 20:10:00

标签: 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 Button" />
      <MediaView id="videoView" fitHeight="400.0" fitWidth="450.0" layoutX="14.0" layoutY="14.0" />
   </children>
</AnchorPane>

这是我的代码:

File f = new File("video.mp4");
Media media = new Media(f.toURI().toString());

MediaPlayer mediaPlayer = new MediaPlayer(media);
mediaPlayer.setAutoPlay(true);

MediaView mediaView = (MediaView) videoLayout.lookup("#videoView");
mediaView.setMediaPlayer(mediaPlayer);

显示虚拟按钮,以便正确加载布局。没有例外或错误,但仍然没有任何反应。我没有看到任何视频帧,没有播放任何内容。我在Windows 7上运行该代码。我做错了什么?

修改

代码没问题。我的所有测试内容都不受支持。如下所示,检查玩家状态是好的:

mediaPlayer.setOnError(()->System.out.println("media error"
    + mediaPlayer.getError().toString()));

到目前为止我遇到了3个问题:

  1. 错误已打印“ERROR_MEDIA_CORRUPTED:ERROR_MEDIA_CORRUPTED”
  2. 没有打印错误,只播放了音频
  3. 引发了异常“MediaException:MEDIA_UNSUPPORTED:无法识别的文件签名!”

3 个答案:

答案 0 :(得分:1)

检查媒体是否受支持:

mediaPlayer.setOnError(()->
    System.out.println("media error"+mediaPlayer.getError().toString()));

如果有MediaException音频格式不受支持,则您无法看到视频,但应用程序将正常启动。

请注意,您可以尝试使用其他方法,将所有代码嵌入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>

答案 1 :(得分:1)

在ubuntu 17.10中,libavcodec存在一些问题。 javafx搜索libavcodec53,但ubuntu 17.10附带更高版本

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

  1. 安装libavcodec57,extras和dev
  2.   

    sudo apt-get install libavcodec57;

         

    sudo apt-get install libavcodec-extra;

         

    sudo apt-get install libavcodec-dev

    2.创建符号链接

      

    cd / usr / lib / x86_64-linux-gnu

         

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

    当javafx现在搜索libavcodec53时,我们指向libavcodec57。

答案 2 :(得分:0)

只是为了帮助别人,写下这个问题的答案。这可能有所帮助。 创建视频播放器时,不应重新初始化mediaView。如果要重新初始化mediaView,则mediaView将丢失原始节点的引用。您只需将mediaPlayer设置为mediaView并检查mediaView的空引用。如果mediaView为null,则将其实例化。

请参阅以下网址并查看itachi给出的答案。 javafx mediaview only the audio is playing

如果您没有使用FXML加载程序来实例化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);
    }