Я делаю мозаику для просмотра видео. Я создаю JFrame с некоторыми компонентами, включая 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;
}
}