VLCJ 上的多个流

Multiple streams on VLCJ

所以,我得到了这个代码

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();
        }
    }

}

这是一个使用 VLCj 显示 4 个摄像头的项目。我试图研究文档,甚至在 Whosebug 中通过多个流看到它,但我发现它令人困惑。我研究了很多但无法确定空指针异常在哪里。

并且它应该显示一个带有 4 Canvas 的 JFrame。我能够使用相同的代码声明 4 个工厂和 4 个媒体播放器,但我认为这不是正确的方法。我想了解我所缺少的。谢谢。

错误:

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

您在第 56 行看到 NPE,因为您尚未在第 10 行(以及第 9 行)初始化数组。

其他代码使用 class 个成员而不是一个数组来保存它们。

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