Изображения замораживаются / задерживаются с помощью VLCj и Java Swing - PullRequest
0 голосов
/ 21 октября 2019

Я делаю мозаику для просмотра видео. Я создаю JFrame с некоторыми компонентами, включая Canvas. Я помещаю экземпляр MediaPlayer на каждый холст и воспроизводю видео. Но у меня проблемы с потерей кадров, задержкой отображения и даже полным зависанием изображений. Что-нибудь можно сделать, чтобы решить эту проблему ??

Мозаика: Images have been hidden to protect software integrity

(Изображения были скрыты для защиты целостности программного обеспечения)

Код:

public class ViewerController {

    private List<EmbeddedMediaPlayer> playerList = new ArrayList<>();

    private List<Canvas> canvasList = new ArrayList<>();

    public ViewerController() {
        gerarTela();
    }

    private void gerarTela() {
        String[] args = {
                "--rtsp-tcp",
                "--network-caching=1000",
                "--file-caching=300",
                "--clock-jitter=0",
                "--clock-synchro=0"
        };
        JFrame janela = geraJframe();
        var painelDaJanela = new JPanel(new GridLayout(0, 4, 5, 5));
        var factory = new MediaPlayerFactory(args);

        for (int i = 0; i < 16; i++) {
            var containerDoVideo = new Canvas();
            containerDoVideo.setBackground(Color.BLACK);

            JPanel painelDoContainer = new JPanel();
            painelDoContainer.setBackground(new Color(31, 27, 36));
            painelDoContainer.setLayout(new BorderLayout());
            painelDoContainer.add(containerDoVideo, BorderLayout.CENTER);

            var player = factory.newEmbeddedMediaPlayer();
            player.setVideoSurface(factory.newVideoSurface(containerDoVideo));

            playerList.add(player);
            painelDaJanela.add(painelDoContainer);
            canvasList.add(containerDoVideo);
        }

        painelDaJanela.setBackground(new Color(31, 27, 36));
        janela.add(painelDaJanela, BorderLayout.CENTER);
        janela.setResizable(true);
        janela.setExtendedState(JFrame.MAXIMIZED_BOTH);
        janela.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent windowEvent) {
                stop();
                super.windowClosing(windowEvent);
            }
        });
        janela.setVisible(true);
    }

    public void play(List<Camera> lista) {
        int limiteLista = lista.size();

        for (int i = 0; i < 16; i++) {
            if (!(i < limiteLista)) {
                canvasList.get(i).setBackground(new Color(31, 27, 36));
            } else {
                Camera camera = lista.get(i);
                playerList.get(i).playMedia(camera.getUrl_video());
            }
        }
    }

    private void stop() {
        playerList.forEach(MediaPlayer::stop);
    }

    private JFrame geraJframe() {
        Toolkit tk = Toolkit.getDefaultToolkit();
        Dimension d = tk.getScreenSize();
        JFrame jFrame = new JFrame();
        jFrame.setMinimumSize(new Dimension(d.width, d.height));
        jFrame.setLayout(new BorderLayout());
        jFrame.setIconImage(tk.getImage(getClass().getResource("/imgs/icon.png")));
        jFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        return jFrame;
    }
}
...