在透明的 JWindow 中播放 ARGB .mov 视频
Play an ARGB .mov video in a transparent JWindow
我正在尝试为我的程序编写启动画面,因为打开它需要很长时间。
我设法用图像做到了,但我不知道如何用 ARGB 视频做到这一点。
首先,我尝试了一张图片:
(在扩展的 JWindow 上 class)
JLabel l = new JLabel("");
JPanel p = new JPanel();
setSize(1024, 1024);
setBackground(new Color(0, 0, 0, 0));
setLocationRelativeTo(null);
l.setBounds(0, 0, 1024, 1024);
l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/" + splashName))));
p.setBounds(0, 0, 1024, 1024);
p.setBackground(new Color(0, 0, 0, 0));
p.add(l);
add(p);
setVisible(true);
原始启动画面:
example.png
我执行代码时的截图:
screenshot.png
效果很好。
之后,我用After Effects制作了启动画面动画(旋转的启动画面)。是的,我确实以 RGB + Alpha 格式导出了 .mov 视频,而 ffmpeg 告诉我同样的情况。
所以,我尝试使用 FFmpegFrameGrabber.grabImage();
来使用 JavaCV 库,但结果很奇怪。 (我知道代码不是很好,但我首先想让它工作)
JLabel l = new JLabel("");
JPanel p = new JPanel();
grabber = new FFmpegFrameGrabber(splashPath);
setSize(1024, 1024);
setLocationRelativeTo(null);
p.setBackground(new Color(0, 0, 0, 0));
p.setBounds(0, 0, 1024, 1024);
l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/icon4.png"))));
l.setBounds(0, 0, 1024, 1024);
p.add(l);
add(p);
grabber.start();
Frame frame;
BufferedImage bi = new BufferedImage(grabber.getImageWidth(), grabber.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
while((frame = grabber.grabImage()) != null) {
bi = new BufferedImage(grabber.getImageWidth(), grabber.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
Java2DFrameConverter.copy(frame, bi);
showFrame(bi);
Thread.sleep(16);
}
grabber.stop();
private void showFrame(BufferedImage frame) {
p.removeAll();
l.setIcon(new ImageIcon(frame));
p.add(l);
repaint();
}
我执行代码时的截图:screenshot2.png
从屏幕截图中,我们可以看到视频已调整大小(宽度变小),并且有一些奇怪的透明蓝线,而其他颜色本应如此。
所以我的问题是:
- 我该如何解决?
- 问题是 JavaCV 吗?
- 在java中有没有其他方法可以将透明视频作为启动画面播放?
感谢 Samuel Audet,我发现 FFmpeg 返回的帧的像素格式是 RGBA,而不是 ARGB。
我们可以通过在 start() 之前调用 setPixelFormat() 来轻松更改 FFMpegFrameGrabber 的像素格式。
此处列出了每种可用的像素格式:
list
就我而言,这是最终解决方案:
grabber = new FFmpegFrameGrabber(splashPath);
grabber.setPixelFormat(avutil.AV_PIX_FMT_ARGB);
grabber.start();
我正在尝试为我的程序编写启动画面,因为打开它需要很长时间。
我设法用图像做到了,但我不知道如何用 ARGB 视频做到这一点。
首先,我尝试了一张图片: (在扩展的 JWindow 上 class)
JLabel l = new JLabel("");
JPanel p = new JPanel();
setSize(1024, 1024);
setBackground(new Color(0, 0, 0, 0));
setLocationRelativeTo(null);
l.setBounds(0, 0, 1024, 1024);
l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/" + splashName))));
p.setBounds(0, 0, 1024, 1024);
p.setBackground(new Color(0, 0, 0, 0));
p.add(l);
add(p);
setVisible(true);
原始启动画面: example.png
我执行代码时的截图: screenshot.png
效果很好。
之后,我用After Effects制作了启动画面动画(旋转的启动画面)。是的,我确实以 RGB + Alpha 格式导出了 .mov 视频,而 ffmpeg 告诉我同样的情况。
所以,我尝试使用 FFmpegFrameGrabber.grabImage();
来使用 JavaCV 库,但结果很奇怪。 (我知道代码不是很好,但我首先想让它工作)
JLabel l = new JLabel("");
JPanel p = new JPanel();
grabber = new FFmpegFrameGrabber(splashPath);
setSize(1024, 1024);
setLocationRelativeTo(null);
p.setBackground(new Color(0, 0, 0, 0));
p.setBounds(0, 0, 1024, 1024);
l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("/icon4.png"))));
l.setBounds(0, 0, 1024, 1024);
p.add(l);
add(p);
grabber.start();
Frame frame;
BufferedImage bi = new BufferedImage(grabber.getImageWidth(), grabber.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
while((frame = grabber.grabImage()) != null) {
bi = new BufferedImage(grabber.getImageWidth(), grabber.getImageHeight(), BufferedImage.TYPE_INT_ARGB);
Java2DFrameConverter.copy(frame, bi);
showFrame(bi);
Thread.sleep(16);
}
grabber.stop();
private void showFrame(BufferedImage frame) {
p.removeAll();
l.setIcon(new ImageIcon(frame));
p.add(l);
repaint();
}
我执行代码时的截图:screenshot2.png
从屏幕截图中,我们可以看到视频已调整大小(宽度变小),并且有一些奇怪的透明蓝线,而其他颜色本应如此。
所以我的问题是:
- 我该如何解决?
- 问题是 JavaCV 吗?
- 在java中有没有其他方法可以将透明视频作为启动画面播放?
感谢 Samuel Audet,我发现 FFmpeg 返回的帧的像素格式是 RGBA,而不是 ARGB。
我们可以通过在 start() 之前调用 setPixelFormat() 来轻松更改 FFMpegFrameGrabber 的像素格式。
此处列出了每种可用的像素格式: list
就我而言,这是最终解决方案:
grabber = new FFmpegFrameGrabber(splashPath);
grabber.setPixelFormat(avutil.AV_PIX_FMT_ARGB);
grabber.start();