视频的 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.2
、platform-3.5.2
和 vlcj-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测试用例:
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);
所以我读过一些旧的 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.2
、platform-3.5.2
和 vlcj-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测试用例:
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);