Несколько потоков на VLCJ - PullRequest
       5

Несколько потоков на VLCJ

0 голосов
/ 11 сентября 2018

Итак, у меня есть этот код

public class MultiThreadedWindow extends JFrame implements ActionListener {

    FormatRtsp parser = new FormatRtsp();
    private JPanel topPanel = new JPanel();
    private JPanel statusPanel = new JPanel();
    private JButton btnPlay = new JButton("Conectar");
    private JButton btnStop = new JButton("Desconectar");
    private JButton btnPause = new JButton("Pausar");
    private MediaPlayerFactory[] factory;
    private EmbeddedMediaPlayer[] mediaPlayer;

    int Video_Width = 500;
    int Video_Height = 300;
    int Num_Video = 4;

    public MultiThreadedWindow() {
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setLayout(new BorderLayout());
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Canvas[] videoCanvas = new Canvas[Num_Video];
        JPanel mainPanel = new JPanel(new FlowLayout());
        JPanel[] vidPanel = new JPanel[Num_Video];

        for (int i = 0; i < Num_Video; i++) {
            vidPanel[i] = new JPanel();
            videoCanvas[i] = new Canvas();
            vidPanel[i].setPreferredSize(new Dimension(Video_Width, Video_Height));
            vidPanel[i].setBackground(Color.black);
            vidPanel[i].setLayout(new BorderLayout());
            videoCanvas[i].setBackground(Color.black);
            vidPanel[i].add(videoCanvas[i], BorderLayout.CENTER);
            mainPanel.add(vidPanel[i]);
        }
        for (int i = 0; i < 4; i++) {
        factory[i] = new MediaPlayerFactory();
        mediaPlayer[i] = factory[i].newEmbeddedMediaPlayer();
        mediaPlayer[i].setVideoSurface(factory[i].newVideoSurface(videoCanvas[i]));
        mediaPlayer[i].setPlaySubItems(true);
        mediaPlayer[i].addMediaPlayerEventListener(new MediaPlayerEventAdapter() {

            @Override
            public void mediaSubItemAdded(MediaPlayer mediaPlayer, libvlc_media_t subItem) {
                List<String> items = mediaPlayer.subItems();
                System.out.println(items);
            }
        });
        }

        this.add(topPanel, BorderLayout.NORTH);
        this.add(mainPanel, BorderLayout.CENTER);
        this.add(statusPanel, BorderLayout.SOUTH);


        btnPlay.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                play();
            }
        });

        btnStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                stop();
            }
        });

        btnPause.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pause();
            }
        });

        topPanel.add(btnPlay);
        topPanel.add(btnStop);
        topPanel.add(btnPause);
    }

    public void start() {
        this.setVisible(true);
        play();
    }

    private void play() {
        mediaPlayer[0].playMedia(parser.formatRtspStream(RTSPADRESS));
        mediaPlayer[1].playMedia(parser.formatRtspStream(RTSPADRESS));
        mediaPlayer[2].playMedia(parser.formatRtspStream(RTSPADRESS));
        mediaPlayer[3].playMedia(parser.formatRtspStream(RTSPADRESS));
    }

    private void stop() {
        mediaPlayer[0].stop();
        mediaPlayer[1].stop();
        mediaPlayer[2].stop();
        mediaPlayer[3].stop();
    }

    private void pause() {
        mediaPlayer[0].pause();
        mediaPlayer[1].pause();
        mediaPlayer[2].pause();
        mediaPlayer[3].pause();
    }

    public void actionPerformed(ActionEvent e) throws IllegalStateException {
        if (e.getActionCommand().equals("OK")) {
            this.dispose();
        }
    }

}

Это проект для отображения 4 камер с использованием VLCj.Я пытался изучить документацию и даже видел ее здесь, в Stackoverflow, по нескольким потокам, но мне это показалось непонятным.Я много исследовал, но не смог определить, где это исключение nullpointerexception.

И он должен отображать JFrame с 4 Canvas.Я смог сделать тот же код, объявляя 4 фактора и 4 медиаплеера, но я не думаю, что это правильный способ сделать это.Я хотел бы понять, чего мне не хватает.Спасибо.

Ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at core.MultiThreadedWindow.<init>(MultiThreadedWindow.java:56)

1 Ответ

0 голосов
/ 11 сентября 2018

Вы видите NPE в строке 56, потому что вы не инициализировали свой массив в строке 10 (и, соответственно, 9).

Другой код использует члены класса, а не массив для хранения их всех.

private MediaPlayerFactory factory0, factory1, factory2, factory3;
private EmbeddedMediaPlayer mediaPlayer0, mediaPlayer1, mediaPlayer2, mediaPlayer3;
...