2015-05-17 61 views
2

播放视频在我FXML文件我有:无法使用JavaFX的MediaPlayer

<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:无法识别的文件签名!”

回答

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> 
+0

没有打印错误。当我这样做:mediaPlayer.setOnReady(() - > System.out.println(“media ready”));我看到媒体已经准备就绪。嵌入到FXML中也不起作用。 – user1723095

+1

我对其他一些视频进行了实验,发现其中一个内容播放声音很好(并且没有从mediaPlayer返回错误)。其他根本不起作用(并且打印不支持的媒体)。第三也不起作用,虽然抛出异常,所以没有打印错误。最后第四场比赛表现不错,所以我认为我的代码没问题。无论如何感谢您的回答,它帮助我找到了问题。 – user1723095

0

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

请参阅以下网址并查看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); 
    } 
1

在Ubuntu 17.10中,libavcodec出现了一些问题。 javafx搜索libavcodec53但是Ubuntu 17。10配备了一个更高版本

您可以通过纠正此问题如下:

  1. 安装libavcodec57,演员和DEV

命令和apt-get安装libavcodec57;

sudo apt-get install libavcodec-extra;

命令和apt-get安装的libavcodec-dev的

2.创建一个符号链接

CD/usr/lib目录/ x86_64的Linux的GNU的

须藤LN -s libavcodec的。 so libavcodec.so.5

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