视频的 VLCJ 鼠标事件输入

VLCJ Mouse Event Input for Video

所以我读过一些旧的 post(自 2011 年起),其中 Windows 在播放视频时支持鼠标事件存在问题,并且必须使用一些 Windows 钩子。然后,我在这里找到了与此问题相关的更新 post:https://github.com/caprica/vlcj/issues/78

在此 post 的最后,讨论了一种接收鼠标单击事件的方法,并且 VLCJ 的开发者本人认可它是支持该功能的正常方式:

Canvas videoSurface = this.mediaPlayerComponent.getVideoSurface();
videoSurface.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Click");
        media_clicked();
    }
});

除了,当我尝试它时,它没有用。

package test;

import com.sun.jna.NativeLibrary;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import javax.swing.JFrame;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;

public class Test {

    public static void main(String[] args) {
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = environment.getDefaultScreenDevice();
        GraphicsConfiguration graphConfigure = device.getDefaultConfiguration();

        JFrame frame = new JFrame(graphConfigure);
        frame.setBackground(Color.BLACK);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setLocationRelativeTo(null);
        frame.setSize(dimension);
        frame.setUndecorated(true);
        frame.setVisible(true);

        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\Program Files (x86)\VideoLAN\VLC");
        EmbeddedMediaPlayerComponent component = new EmbeddedMediaPlayerComponent();
        EmbeddedMediaPlayer player = component.getMediaPlayer();

        Canvas videoSurface = component.getVideoSurface();
        videoSurface.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Click");
            }        

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("Click");
            }
        });

        frame.getContentPane().add(component, BorderLayout.CENTER);
        frame.repaint();
        frame.setVisible(true);
        String currDir = System.getProperty("user.dir");
        player.playMedia(currDir + "\sample_video_01.mp4");
    }
}

所以视频可以播放,但即使在播放视频时点击屏幕,也不会在控制台的任何地方打印短语 "Clicked"。我也尝试过 frame.getContentPane().add(videoSurface, BorderLayout.CENTER); 而不是 frame.getContentPane().add(component, BorderLayout.CENTER);,但都无法打印 "Clicked".

我将 NetBeans 与 jna-3.5.2platform-3.5.2vlcj-3.1.0 一起使用。任何指针将不胜感激。

您 link 访问的 vlcj 项目问题页面提到了另一个问题,该问题有答案,包括一个完整的工作测试。

基本上你必须这样做(在 Windows):

player.setEnableMouseInputHandling(false);

也许这样:

player.setEnableKeyInputHandling(false);

你在这里告诉 LibVLC 的基本上是 "don't mess with the mouse (or keyboard) events" 然后将它们发送给我。

这还不是全部……

要传递键盘事件,您必须在应用程序中正确管理焦点。单击视频表面不会(取决于您的平台)自动获取焦点。

一种解决方法是:

mediaPlayer.getVideoSurface().requestFocusInWindow();

这意味着当您 window 专注时,例如通过单击,焦点将转移到您的视频表面。

下面是稳定的link测试用例:

https://github.com/caprica/vlcj/blob/vlcj-3.5.0/src/test/java/uk/co/caprica/vlcj/test/inputlistener/InputListenerTest.java

None 在 Linux.

上是必需的

我正在为像我一样寻求此功能的人更新此功能。 api 在我使用的当前更新 4.2.0 中发生了很大变化 4 年后,您必须执行以下操作

EmbeddedMediaPlayerComponent mpc1 = new EmbeddedMediaPlayerComponent();
mpc1.mediaPlayer().input().enableKeyInputHandling(false);
mpc1.mediaPlayer().input().enableMouseInputHandling(false);

如上所述,这将禁用vlcj video surface组件中的处理,后面可以按如下方式使用

MouseListener l = new MouseListener() {

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("event detected mouseReleased");

    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("event detected mousePressed");

    }

    @Override
    public void mouseExited(MouseEvent e) {
        System.out.println("event detected mouseExited");

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        System.out.println("event detected mouseEntered");

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("event detected mouseClicked");

    }
};

mpc1.videoSurfaceComponent().addMouseListener(l);