java - 将 VLCJ 媒体播放器添加到 JavaFX 中的 Canvas

标签 java javafx fxml vlcj

我正在学习如何将 VLCJ 播放器添加到用 javaFX 和 FXML 编写的应用程序中,我在其他问题中读到我必须添加到 Canvas ,因此我在 anchor 板下的 FXML 中创建了一个 Canvas 。

 <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);

}


}

当我运行我的应用程序时,出现异常视频表面组件必须可显示

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

最佳答案

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

乍一看,一个解决方案似乎是使用 javafx.embed.swing.SwingNodeembed some Swing content在您的 JavaFX 应用程序中。但是,这行不通,因为 EmbeddedMediaPlayerComponent是一个重量级组件,SwingNode 的 javadoc状态:“JComponent 实例中包含的组件层次结构不应包含任何重量级组件,否则 SwingNode 可能无法绘制它”(请参阅​​ this answer )。

所以,据我所知,没有办法使用EmbeddedMediaPlayerComponent在javaFX中。

一种可能的解决方案是使用 vlcj 的 DirectMediaPlayerComponent ,并自行实现在 JavaFX Canvas 上编写每个帧的代码。有一个相关的例子on github 。请注意,这不会像 EmbeddedMediaPlayerComponent 那样高效(就性能而言)。 .

关于java - 将 VLCJ 媒体播放器添加到 JavaFX 中的 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40507922/

相关文章:

java - Jackson : json schema references other schemas, 可以禁用吗?

java - 发生此错误时 Error :(1, 1) java.desktop 和 java.datatransfer 中的 java : module JavaFX reads package java. awt

sorting - JavaFX 按日期对 TableView 列进行排序(dd/mm/yyyy 格式)

javafx - fxml:如何处理 Controller 中的按钮操作?

java - FXML 加载问题

java - 使用 AES-CFB 在 Python 中加密并在 Java 中解密

java - 无法检查 if 语句中的 LongAdder 值

JavaFX - 为类提供对 Controller 方法的访问权限以在 Canvas 上绘制

JavaFX TextArea字符串读取问题

javafx - 在 Controller 内加载 FXML 文件,但也使用 NetBeans 的 "Make Controller"