2

如何在 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);
    }
}

这是结果:

结果 http://vitamin.vipdesign.com.ua/1n7tJ.jpg

4

3 回答 3

2

MadProgrammer 是对的。VLCJ 将本机视频表面附加到 java.awt.Canvas。您可以为自己的 Canvas 提供覆盖的 paint(..) 方法,但这无济于事。这是在 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);
    }

本机 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 覆盖由于明显的原因不是透明的。请让我们知道它是否按预期工作以及是否有任何其他陷阱。

于 2013-06-05T08:00:44.817 回答
1

您需要花时间阅读vlcj wiki ...

您不能简单地在重量级视频表面 Canvas 组件之上添加一个轻量级透明 JComponent - 它不会起作用。

查看叠加图形了解更多详情

于 2013-06-05T06:45:43.123 回答
0

看起来您正在创建一个具有 alpha 值的颜色(意味着它是透明的):

new Color(0, 200, 0, 50)

尝试使用

new Color(0, 200, 0)

(除非我错过了问题的重点)

于 2013-06-04T21:57:44.533 回答