gpt4 book ai didi

java - 添加透明 JLabel 顶部 vlcj MediaPlayer?

转载 作者:行者123 更新时间:2023-12-04 04:54:41 26 4
gpt4 key购买 nike

如何在 vlcj MediaPlayer 上添加具有透明背景的 JLabel?

我把源代码放在下面,但它不能正常工作,因为 JLabel 没有设置透明背景。

import com.sun.jna.NativeLibrary;
import javax.swing.*;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

class VideoExample extends JFrame {

private EmbeddedMediaPlayerComponent mediaPlayerComponent;

public VideoExample(String path) {
super("Простой видео плеер");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640, 480);

//Create JLayeredPane
JLayeredPane mainLayer = new JLayeredPane();
mainLayer.setSize(640,480);

//Create MediaPlayer on background
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
mediaPlayerComponent.setLocation(0, 0);
mediaPlayerComponent.setSize(mainLayer.getSize());

//Create MediaPlayer on foreground
JLabel label = new JLabel("LABEL", JLabel.CENTER);
label.setBounds(100, 100, 200, 100);
label.setOpaque(false);

mainLayer.add(mediaPlayerComponent, JLayeredPane.DEFAULT_LAYER); //add mediaPlayer in DEFAULT_LAYER
mainLayer.add(label, JLayeredPane.PALETTE_LAYER); //add label in PALETTE_LAYER
add(mainLayer); // add JLayeredPane in JFrame

setVisible(true);
mediaPlayerComponent.getMediaPlayer().playMedia(path);
}

public static void main(String[] args) {
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), System.getProperty("user.dir") + "/lib/vlc64");
final String mrl = "D:\\Candlelight_QT.mov";
new VideoExample(mrl);
}
}

这是结果:

The result http://vitamin.vipdesign.com.ua/1n7tJ.jpg

最佳答案

MadProgrammer 是对的。 VLCJ 将 native 视频表面附加到 java.awt.Canvas。您可以使用重写的paint(..) 方法提供自己的Canvas,但这无济于事。这就是 Linux 内部发生的事情 LinuxVideoSurfaceAdapter :

    public void attach(LibVlc libvlc, MediaPlayer mediaPlayer, long componentId) {
Logger.debug("attach(componentId={})", componentId);
libvlc.libvlc_media_player_set_xwindow(mediaPlayer.mediaPlayerInstance(), (int)componentId);
}

native java.awt.Canvas X11 窗口用作 VLC 输出的目标。

我最好的选择是使用像 madprogrammer 提到的覆盖机制。基本上,您需要通过继承 EmbeddedMediaPlayerComponent 来提供 Window 或 JWindow。由于透明度非常依赖于平台,因此您需要检查目标环境是否支持所需的透明度/半透明类型(注意:复杂的图形配置可能对每个屏幕设备具有不同的功能!):
final boolean perPixelTranslucencySupported = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT);

创建 EmbeddedMediaPlayerComponent 的子类:
  mediaPlayerComponent = new EmbeddedMediaPlayerComponent() {

@Override
protected Window onGetOverlay() {
final JWindow transparentWindow = new JWindow();

// Set basic window opacity if required - the window system must support WindowTranslucency (i.e. PERPIXEL_TRANSLUCENT)!
transparentWindow.setOpacity(0.8f);
// White with transparent alpha channel - WindowTranslucency is required for translucency.
transparentWindow.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.0f));

final JLabel superImposedLightweigtLabel = new JLabel("Hello, VLC.", JLabel.CENTER);
superImposedLightweigtLabel.setOpaque(false);

transparentWindow.getContentPane().add(superImposedLightweigtLabel);
return transparentWindow;
}
...
}

使主 JFrame 可见后,启用覆盖:
mediaPlayerComponent.getMediaPlayer().enableOverlay(true);

我无法验证结果,因为我现在在没有透明功能的虚拟机中工作,所以我的实际 JWindow 覆盖由于显而易见的原因不透明。请让我们知道它是否按预期工作以及是否有任何其他陷阱。

关于java - 添加透明 JLabel 顶部 vlcj MediaPlayer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16928069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com