将 VLCJ 媒体播放器添加到 JavaFX 中的 canvas

Add a VLCJ media player to a canvas in JavaFX

我正在学习如何将 VLCJ 播放器添加到我用 javaFX 和 FXML 编写的应用程序中 我在其他问题中读到我必须添加到 canvas 所以我在我的文件中创建了一个 canvas锚窗格下的 FXML。

 <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

我做错了什么?我已经阅读了很多其他问题,但我不明白它们。

class uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent 继承自 java.awt.Panel - 它是一个 AWT 组件,与 JavaFX 完全无关。它旨在与 AWT 或 Swing 一起使用。

乍一看,一种解决方案似乎是使用 javafx.embed.swing.SwingNodeembed some Swing content inside your JavaFX application. However, this won't work, because EmbeddedMediaPlayerComponent is a heavyweight component, and the javadoc for SwingNode states : "The hierarchy of components contained in the JComponent instance should not contain any heavyweight components, otherwise SwingNode may fail to paint it" (see this answer)。

因此,据我所知,无法在 javaFX 中使用 EmbeddedMediaPlayerComponent

一个可能的解决方案是使用 vlcj DirectMediaPlayerComponent,并自己实现代码以在 JavaFX Canvas 上编写每一帧。有一个相关的例子on github。请注意,这不会像 EmbeddedMediaPlayerComponent.

那样有效(就性能而言)