微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在透明 JWindow 中播放 ARGB .mov 视频

如何解决在透明 JWindow 中播放 ARGB .mov 视频

我正在尝试为我的程序编写启动画面,因为它需要很长时间才能打开。

我设法用图像做到了,但我不知道如何用 ARGB 视频做到这一点。

首先,我尝试使用图像: (在 JWindow 扩展类上)

JLabel l = new JLabel("");
JPanel p = new JPanel();

setSize(1024,1024);
setBackground(new Color(0,0));
setLocationRelativeto(null);

l.setBounds(0,1024,1024);
l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsstream("/" + splashName))));

p.setBounds(0,1024);
p.setBackground(new Color(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));
p.setBounds(0,1024);

l.setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsstream("/icon4.png"))));
l.setBounds(0,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(),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

从截图中,我们可以看到视频被调整了大小(宽度更小),并且有一些奇怪的透明蓝线,其他颜色应该是。

所以我的问题是:

  1. 我该如何解决
  2. JavaCV 是问题吗?
  3. 有没有其他方法可以在 Java 中播放透明视频作为启动画面?

解决方法

感谢 Samuel Audet,我发现 FFmpeg 返回的帧的像素格式是 RGBA,而不是 ARGB。

我们可以通过在 start() 之前调用 setPixelFormat() 来轻松更改 FFMpegFrameGrabber 的像素格式。

这里有每个可用像素格式的列表: list

就我而言,这是最终解决方案:

grabber = new FFmpegFrameGrabber(splashPath);
grabber.setPixelFormat(avutil.AV_PIX_FMT_ARGB);
grabber.start();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。