使用SwingNode在JavaFX中显示VlcJ

时间:2014-07-17 08:08:02

标签: java swing javafx-8 vlcj

FXMLController初始化方法:

@FXML
private VBox vbContainer;
MediaPlayerVLC m_mediaPlayer;

public void initialize(URL url, ResourceBundle rb) {
        final SwingNode swingNode = new SwingNode();

        m_mediaPlayer = new MediaPlayerVLC();
        createAndSetSwingContent(swingNode, m_mediaPlayer);

        vbContainer.getChildren().add(0, swingNode);
    }

并且createAndSetSwingContent():

private void createAndSetSwingContent(final SwingNode swingNode, JComponent jComponent) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                swingNode.setContent(jComponent);
            }
        });
    }

MediaPlayerVLC类:

package javafxswing;

import javax.swing.JPanel;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;

public class MediaPlayerVLC extends JPanel {

    private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

    public MediaPlayerVLC() {

        setSize(350, 320);
        setVisible(true);        
        mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
        mediaPlayerComponent.setSize(350, 320);
        add(mediaPlayerComponent);
    }

    public MediaPlayer getMediaPlayer() {
        return mediaPlayerComponent.getMediaPlayer();
    }
}

我在FXMLController中点击按钮播放媒体:

@FXML
private void handleButtonAction(ActionEvent event) {
     System.out.println("You clicked me!");
     m_currentVideo = "video.mov";
     m_mediaPlayer.getMediaPlayer().playMedia(m_currentVideo);
}

现在,问题是:视频开始播放但我看不到图像。我说它开始播放因为我能听到音频。我做错了什么?

任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:2)

简而言之,它不会以这种方式工作。

来自SwingNode的Javdoc:http://docs.oracle.com/javase/8/javafx/api/javafx/embed/swing/SwingNode.html

部分说明:

  

JComponent实例中包含的组件层次结构不应包含任何重量级组件,否则SwingNode可能无法绘制它。

对于vlcj,EmbeddedMediaPlayerComponent扩展了Panel,一个重量级的AWT组件。

要与vlcj一起使用JavaFX,您可能需要自己直接渲染视频数据。这就是vlcj所谓的DirectMediaPlayerComponent所针对的。这种方法的本质是DirectMediaPlayerComponent接收每帧视频数据进行渲染,然后您可以使用PixelWriter或其他一些方法自行渲染。

这里有一个vlcj-javafx项目https://github.com/caprica/vlcj-javafx,这种方法适用于Java7。由于错误的线程,它不适用于Java8,在此处记录:https://github.com/caprica/vlcj-javafx/issues/3