如何在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);
}
}
结果如下:
答案 0 :(得分:2)
MadProgrammer是对的。 VLCJ将原生视频表面附加到java.awt.Canvas。您可以使用重写的paint(..)方法提供自己的Canvas,但这无济于事。这就是LinuxVideoSurfaceAdapter
中Linux内部发生的事情:
public void attach(LibVlc libvlc, MediaPlayer mediaPlayer, long componentId) {
Logger.debug("attach(componentId={})", componentId);
libvlc.libvlc_media_player_set_xwindow(mediaPlayer.mediaPlayerInstance(), (int)componentId);
}
本机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叠加层由于显而易见的原因而不透明。如果它按预期工作,如果有任何其他陷阱,请告诉我们。
答案 1 :(得分:1)
您需要花时间阅读vlcj wiki ...
你不能简单地在上面添加一个轻量级的透明JComponent 重量级视频表面Canvas组件 - 它不起作用。
查看Overlaying Graphics了解详情
答案 2 :(得分:0)
您似乎正在创建具有Alpha值的颜色(意味着它是透明的):
new Color(0, 200, 0, 50)
尝试使用
new Color(0, 200, 0)
(除非我错过了问题的重点)