2015-05-17 80 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。