将 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.SwingNode
到 embed 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
.
那样有效(就性能而言)
我正在学习如何将 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.SwingNode
到 embed 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
.