2016-11-09 377 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',但是它的上面我选择了一个新的摇摆帧来播放媒体而不是嵌入它。 –