【问题标题】:Add a VLCJ media player to a canvas in JavaFX在 JavaFX 中将 VLCJ 媒体播放器添加到画布
【发布时间】:2016-11-09 13:15:44
【问题描述】:

我正在学习如何将 VLCJ 播放器添加到我用 javaFX 和 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

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

【问题讨论】:

    标签: java javafx fxml vlcj


    【解决方案1】:

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

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

    所以,据我所知,tehre 无法在 javaFX 中使用EmbeddedMediaPlayerComponent

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

    【讨论】:

    • 感谢您的回答。我花了几个小时尝试实现DirectMediaPlayerComponent,但它在我之上,所以我选择了一个新的摆动框架来播放媒体而不是嵌入它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    相关资源
    最近更新 更多