首页 > 解决方案 > 使用 VLCj 和 Java Swing 冻结/延迟图像

问题描述

我正在制作用于观看视频的马赛克。我用一些组件构建了一个 JFrame,包括 Canvas。我在每个 Canvas 上放置一个 MediaPlayer 实例并播放视频。但我遇到了帧丢失、显示延迟甚至图像完全冻结的问题。有什么办法可以解决这个问题吗??

马赛克: 图像已被隐藏以保护软件完整性

(图像已被隐藏以保护软件完整性)

代码:

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

标签: javaswingvlcj

解决方案


推荐阅读