2013-12-15 121 views
7

我跟着一些關於將JavaFX和Swing結合起來的教程(JFrame)來播放視頻,但是我得到的只是一個黑屏,視頻應該沒有任何實際內容播放,也沒有錯誤報告。JavaFX視頻沒有播放

我在這裏做錯了什麼,爲什麼不玩視頻播放?

我試了幾個FLV的視頻,他們都將開始播放,我在Windows上運行jre7和jdk1.7.0_45 8.1ñ臨用(他們當我在瀏覽器中打開他們一起玩)

K-精簡版全編解碼器包安裝

編輯:jewelsea的評論後更新了我的代碼,一切都沒有改變,黑匣子仍然沒有出現內容播放,控制檯不顯示任何文本上來

package com.example.test; 

import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.event.Event; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.SceneBuilder; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaErrorEvent; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 
import javafx.scene.paint.Color; 

import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       initAndShowGUI(); 
      } 
     }); 
    } 

    private static void initAndShowGUI() { 
     // This method is invoked on the EDT thread 
     JFrame frame = new JFrame("Test"); 
     final JFXPanel fxPanel = new JFXPanel(); 
     frame.add(fxPanel); 
     frame.setSize(640, 480); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       initFX(fxPanel); 
      } 
     }); 
    } 

    private static void initFX(JFXPanel fxPanel) { 
     // This method is invoked on the JavaFX thread 
     Scene scene = createScene(); 
     fxPanel.setScene(scene); 
    } 

    private static Scene createScene() { 
     String source; 
     Media media; 
     MediaPlayer mediaPlayer; 
     MediaView mediaView = null; 
     try { 
      media = new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"); 
      if (media.getError() == null) { 
       media.setOnError(new Runnable() { 
        public void run() { 
         // Handle asynchronous error in Media object. 
         System.out.println("Handle asynchronous error in Media object"); 
        } 
       }); 
       try { 
        mediaPlayer = new MediaPlayer(media); 
        mediaPlayer.setAutoPlay(true); 

        if (mediaPlayer.getError() == null) { 
         mediaPlayer.setOnError(new Runnable() { 
          public void run() { 
           // Handle asynchronous error in MediaPlayer object. 
           System.out.println("Handle asynchronous error in MediaPlayer object"); 
          } 
         }); 
         mediaView = new MediaView(mediaPlayer); 
         mediaView.setOnError(new EventHandler() { 
          public void handle(MediaErrorEvent t) { 
           // Handle asynchronous error in MediaView. 
           System.out.println("Handle asynchronous error in MediaView: "+ t.getMediaError()); 
          } 

          @Override 
          public void handle(Event arg0) { 
           // TODO Auto-generated method stub 
           System.out.println("Handle asynchronous error in MediaView arg0: "+arg0.toString()); 
          } 
         }); 
        } else { 
         // Handle synchronous error creating MediaPlayer. 
         System.out.println("Handle synchronous error creating MediaPlayer"); 
        } 
       } catch (Exception mediaPlayerException) { 
        // Handle exception in MediaPlayer constructor. 
        System.out.println("Handle exception in MediaPlayer constructor: "+ mediaPlayerException.getMessage()); 
       } 
      } else { 
       // Handle synchronous error creating Media. 
       System.out.println("Handle synchronous error creating Media"); 
      } 
     } catch (Exception mediaException) { 
      // Handle exception in Media constructor. 
      System.out.println("Handle exception in Media constructor: "+mediaException.getMessage()); 
     } 

     Group root = new Group(); 
     Scene scene = SceneBuilder.create().width(640).height(480).root(root).fill(Color.WHITE).build(); 

     if(mediaView != null) { 
      root.getChildren().add(mediaView); 
     } 

     return scene; 
    } 
} 
+0

在JavaFX捕捉媒體錯誤是挑剔的。 JavaFX media javadoc中有一個[error catchching template](http://docs.oracle.com/javafx/2/api/javafx/scene/media/package-summary.html)。在你的程序中實現模板並用你的結果更新問題。還要檢查你的非oracle flv文件是否是vp6編碼的。 – jewelsea

+0

我添加了模板,遺憾的是沒有拋出任何異常 – xorinzor

+0

您是否嘗試在純FX應用程序中播放該視頻? –

回答

2

因此,我安裝了Windows媒體功能包,以獲得Adobe Premiere Pro工作(因爲它需要一個dll文件從Windows媒體播放器沒有安裝,因爲我運行了N版本的Windows),現在視頻確實爲我玩了。

我不能說100%的確認原因是沒有安裝WMP,因爲媒體功能包可能會以及安裝了其他東西,解決了我的問題,但問題解決:)

我想感謝其他答案嘗試,我真的很感激它。

+0

同樣適用於我 - 沒有聲音,沒有錯誤,沒有任何...直到我在http://www.microsoft.com/en-us/download/details.aspx?id=40744上安裝了Windows Media功能包 –

0

試試這個,它爲我工作:

package de.professional_webworkx.swing; 

import javafx.application.Platform; 
import javafx.embed.swing.JFXPanel; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.SceneBuilder; 
import javafx.scene.media.Media; 
import javafx.scene.media.MediaPlayer; 
import javafx.scene.media.MediaView; 

import javax.swing.JFrame; 

public class MyFrame extends JFrame { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    /** 
    * Create a new Frame, set title, ... 
    */ 
    public MyFrame() { 

     this.setTitle("Swing and JavaFX"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setSize(1024, 768); 

     // create a JFXPanel 
     final JFXPanel jfxPanel = new JFXPanel(); 

     // add the jfxPanel to the contentPane of the JFrame 
     this.getContentPane().add(jfxPanel); 
     this.setVisible(true); 

     Platform.runLater(new Runnable() { 

      @Override 
      public void run() { 
       jfxPanel.setScene(initScene()); 
      } 
     }); 
    } 

    public static final void main (String[] args) { 
     new MyFrame(); 
    } 

    /** 
    * init the JFX Scene and 
    * @return scene 
    */ 
    private Scene initScene() { 

     Group root = new Group(); 
     SceneBuilder<?> sb = SceneBuilder.create().width(640).height(400).root(root); 
     Media video = new Media("http://download.oracle.com/otndocs/products/javafx/oow2010-2.flv"); 
     MediaPlayer mediaPlayer = new MediaPlayer(video); 
     mediaPlayer.setAutoPlay(true); 
     mediaPlayer.play(); 

     MediaView view = new MediaView(mediaPlayer); 

     root.getChildren().add(view); 
     Scene scene = sb.build(); 


     return scene; 

    } 
} 

帕特里克

+0

不幸的是,這也只是在窗口內提供了一個黑匣子,它似乎好像視頻不會加載,但沒有異常或返回 – xorinzor

+0

您使用JDK> = 1.7 Update 10並手動將jfxrt.jar添加到Classpath中? – Patrick

+0

是的,這是正確的 – xorinzor

0

我把你的代碼,並試圖在我的機器(Win7的JDK 1.7.0_25)上運行,並得到了相同的結果。黑盒子,沒有視頻。

我注意到您沒有設置mediaPlayer.setAutoPlay(true)所以我加了權之前mediaPlayer傳遞給MediaViewcreateScene()這一呼籲。現在播放似乎爲我工作。

// ... prior code omitted 

    // added this to OP's code 
    mediaPlayer.setAutoPlay(true); 

    mediaView = new MediaView(mediaPlayer); 
    mediaView.setOnError(new EventHandler() { 
     public void handle(MediaErrorEvent t) { 
      // Handle asynchronous error in MediaView. 
      System.out.println("Handle asynchronous error in MediaView: "+ t.getMediaError()); 
     } 

// ... additional code omitted 

編輯:autoPlay屬性默認爲false - 你可以調用mediaPlayer.isAutoPlay()進行檢查。如果不調用mediaPlayer.setAutoPlay(true)mediaPlayer.play(),視頻將永遠不會播放。

編輯2:我剛剛在關於另一個答案的評論中注意到,您在播放JavaFX之外的視頻時遇到問題。如果您尚未安裝,請嘗試下載VLC以查看視頻是否可以使用該視頻播放。我相信安裝ffdshow tryouts將提供必要的編解碼器來播放Windows Media Player中的FLV。 (雖然我認爲所有版本的K-lite編解碼器包含FLV支持)

+0

我添加了自動播放功能(必須在某個地方下滑,我原來是這麼做的),並安裝了ffdshow試用版(我已經安裝了VLC),但仍然沒有播放 – xorinzor

1

請不要介意我是否寫這個答案。我知道這是一個非常古老的問題,但這個答案可能有助於其他人。我目前正在開發一個JavaFX應用程序,它需要根據其類型執行一個文件。 我的應用程序第一次播放視頻,但是當我點擊另一個mp4視頻文件時,它沒有播放。 這是我最初的代碼。

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); 
     mediaView = new MediaView(mediaPlayer); 
     runnable =() -> { 
      System.out.println("Inside runnable VideoProcesser Thread = " + Thread.currentThread().getName()); 
      mediaPlayer.play(); 
     }; 
     mediaPlayer.setOnReady(runnable); 
     setVideoMediaStatus(PLAYING); 
     pane.getChildren().add(mediaView); 
    } 

則因爲視頻播放器屏幕一片漆黑,我認爲問題是與媒體的看法,所以我添加了以下兩個行,

if(mediaView == null) { 
      mediaView = new MediaView(mediaPlayer); 
     } 
     mediaView.setMediaPlayer(mediaPlayer); 

現在,當我點擊不同的視頻我的應用程序玩得很好。 以下是完整的代碼。

Media media; 
MediaPlayer mediaPlayer; 
MediaView 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); 
     } 

請注意,如果您使用FXML來實例化mediaView,那麼不要再次實例化它。再次實例化可能會使mediaView失去原始節點的引用。 參考這篇文章,由itachi回答, javafx mediaview only the audio is playing