2016-11-09 37 views
1

我正在學習如何將VLCJ播放器添加到使用javaFX和FXML編寫的應用程序中我在其他問題中閱讀了其他問題,我必須將其添加到畫布中,因此我創建了一個畫布FXML在一個anchorpane下。在JavaFX中添加VLCJ媒體播放器到畫布

<Canvas fx:id="mediaPlayerCanvas" height="174.0" layoutX="-4.0" layoutY="-2.0" width="595.0" /> 

然後我初始化它在我application.java

@FXML 
public void mediaPlayerCanvas() 
{ 
mediaPlayer = new MediaPlayer(); 
} 

最後我創造一個MediaPlayer.java包括該

package Lasercontroller; 


import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.RootPaneContainer; 
import javax.swing.SwingUtilities; 

import javafx.embed.swing.JFXPanel; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.layout.Pane; 
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; 
import uk.co.caprica.vlcj.discovery.NativeDiscovery; 

public class MediaPlayer { 
private final Canvas canvas; 

private final EmbeddedMediaPlayerComponent mediaPlayerComponent; 

public synchronized void start(final String[] args) { 
    new NativeDiscovery().discover(); 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new MediaPlayer(); 
     } 
    }); 
} 

public MediaPlayer() { 
    canvas = new Canvas(); 
    //canvasl.setBounds(100, 100, 600, 400); 


    String mediaLocation = "rtsp://192.168.1.175/stream1"; 
    canvas.setVisible(true); 
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); 
    //panel.setContentPane(mediaPlayerComponent); 

    mediaPlayerComponent.getMediaPlayer().playMedia(mediaLocation); 

} 


} 

當我運行我的應用程序我得到一個異常The video surface component must be displayable

我做錯了什麼?我讀了很多其他問題,但我不明白他們。

回答

1

uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent繼承自java.awt.Panel - 它是AWT組件,與JavaFX完全無關。它旨在與AWT或Swing一起使用。

初看起來,一種解決方案似乎是在您的JavaFX應用程序中使用javafx.embed.swing.SwingNodeembed some Swing content。但是,這不起作用,因爲EmbeddedMediaPlayerComponent是一個重量級組件,javadoc的SwingNode指出:「JComponent實例中包含的組件的層次結構不應包含任何重量級組件,否則SwingNode可能無法繪製它」(請參閱​​this answer )。

所以,據我所知,在javaFX中tehre是無法使用EmbeddedMediaPlayerComponent的。

一個可能的解決方案是使用vlcj的DirectMediaPlayerComponent,並自己實現將每個幀寫入JavaFX Canvas的代碼。有一個相關示例on github。請注意,這不會像EmbeddedMediaPlayerComponent那樣有效(在性能方面)。

+0

感謝您的回答。我花了幾個小時試圖實現'DirectMediaPlayerComponent',但是它的上面我選擇了一個新的搖擺幀來播放媒體而不是嵌入它。 –