VLCJ player crashing in a JavaFX Scene

0

I need multiple players on a JavaFX scene, with FXML, to do a CCTV monitoring system, displaying streams of live cameras.

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import java.net.URL;
import java.util.ResourceBundle;

import static uk.co.caprica.vlcj.javafx.videosurface.ImageViewVideoSurfaceFactory.videoSurfaceForImageView;


public class allCamerasMainGridScreenController implements Initializable {
    public MediaPlayerFactory mediaPlayerFactory;
    public  EmbeddedMediaPlayer embeddedMediaPlayer;

    @FXML BorderPane mainBorderPane;
    @FXML GridPane cameraViewGrid;


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
            ImageView cameraView = new ImageView();
            mediaPlayerFactory = new MediaPlayerFactory();
            embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
            cameraView.setPreserveRatio(true);
            cameraView.setFitHeight(340);
            embeddedMediaPlayer.videoSurface().set(videoSurfaceForImageView(cameraView));
            cameraViewGrid.add(cameraView,0,0);
            embeddedMediaPlayer.media().play("http://10.0.0.6:8081");
    }

}

With this code I can get a player running, but it crashes after a few seconds, throwing this message on IntelliJ

Process finished with exit code -1073741819 (0xC0000005)

java
javafx
vlcj
asked on Stack Overflow May 16, 2020 by DarkStrix

1 Answer

0

With the comments saying that the controller needs a hard reference, I think I was able to solve this properly.

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import java.net.URL;
import java.util.ResourceBundle;

import static uk.co.caprica.vlcj.javafx.videosurface.ImageViewVideoSurfaceFactory.videoSurfaceForImageView;


public class mainGridScreenController implements Initializable {
    public MediaPlayerFactory mediaPlayerFactory;
    public  EmbeddedMediaPlayer embeddedMediaPlayer;

    @FXML BorderPane mainBorderPane;
    @FXML GridPane cameraViewGrid;


    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        //Just by adding this two lines the controller isn't elegible for garbage collection anymore
        mainGridController mainGridController = new mainGridController();
        mainBorderPane.setUserData(this);


        ImageView cameraView = new ImageView();
        mediaPlayerFactory = new MediaPlayerFactory();
        embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
        cameraView.setPreserveRatio(true);
        cameraView.setFitHeight(340);
        embeddedMediaPlayer.videoSurface().set(videoSurfaceForImageView(cameraView));
        cameraViewGrid.add(cameraView,0,0);
        embeddedMediaPlayer.media().play("http://10.0.0.6:8081");
    }

}

answered on Stack Overflow May 18, 2020 by DarkStrix • edited May 25, 2020 by DarkStrix

User contributions licensed under CC BY-SA 3.0