java - 使用 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;
}
}
解决方案
推荐阅读
- java - 将 XML 转换为 Avro 并生成 AVRO 模式
- reactjs - 如何使用 React 钩子来确定侧边栏是否应该显示?
- flutter - 如何模拟用于测试颤动屏幕小部件的导航参数?
- xslt - xsl 中的 if 语句
- python - parsimonious - 一个简单的递归模式
- react-native - 使用“this.props.navigation.navigate”时如何防止换屏?
- javascript - Cordova CSP 拒绝本地服务器
- javascript - 滑块上的按钮无响应
- php - Laravel 从给定的 URL 获取路由
- javascript - 如何在按钮上显示/隐藏文本旁边显示图标?