Добавьте медиаплеер VLCJ на холст в JavaFX

Я изучаю, как добавить проигрыватель VLCJ в свое приложение, написанное с помощью javaFX и FXML. Я читал в других вопросах, которые мне пришлось добавить на холст, поэтому я создал холст в своем 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

Что я сделал не так? Я прочитал много других вопросов, но я их не понимаю.


person Display Name    schedule 09.11.2016    source источник


Ответы (1)


Класс uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent наследуется от java.awt.Panel — это компонент AWT, совершенно не связанный с JavaFX. Он предназначен для использования с AWT или Swing.

На первый взгляд, одним из решений может показаться использование javafx.embed.swing.SwingNode для встраивания некоторое содержимое Swing внутри вашего приложения JavaFX. Однако это не сработает, поскольку EmbeddedMediaPlayerComponent является тяжеловесным компонентом, а в javadoc для SwingNode указано: «Иерархия компонентов, содержащаяся в экземпляре JComponent, не должна содержать никаких тяжеловесных компонентов, иначе SwingNode может не отобразить его» (см. href="https://stackoverflow.com/a/24803535/3801695">этот ответ).

Итак, насколько я знаю, нет возможности использовать EmbeddedMediaPlayerComponent в javaFX.

Одним из возможных решений является использование DirectMediaPlayerComponent vlcj и реализация собственного кода для записи каждого кадра на холсте JavaFX. Соответствующий пример есть на github. Обратите внимание, что это будет не так эффективно (с точки зрения производительности), как EmbeddedMediaPlayerComponent.

person Cyäegha    schedule 09.11.2016
comment
Спасибо за Ваш ответ. Я трачу несколько часов, пытаясь реализовать DirectMediaPlayerComponent, но это выше меня, поэтому я выбрал новую поворотную раму для воспроизведения мультимедиа вместо ее встраивания. - person Display Name; 10.11.2016