所以我读过一些旧的帖子(从2011年开始),Windows在播放视频时会出现支持鼠标事件的问题,并且必须使用一些Windows钩子。然后,我在此处找到了与此问题相关的最新帖子:https://github.com/caprica/vlcj/issues/78
在本文的最后,讨论了一种接收鼠标点击事件的方法,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”。
我正在使用带有jna-3.5.2
,platform-3.5.2
和vlcj-3.1.0
的NetBeans。任何指针都会受到赞赏。
答案 0 :(得分:0)
您链接到的vlcj项目问题页面引用了另一个问题,该问题有答案,包括完全正常运行的测试。
基本上你必须这样做(在Windows上):
player.setEnableMouseInputHandling(false);
也许这个:
player.setEnableKeyInputHandling(false);
你在这里告诉LibVLC的是“不要乱用鼠标(或键盘)事件”并将它们发送给我。
这不完全是故事......
对于要交付的键盘事件,您必须在应用程序中正确管理焦点。点击视频表面不(取决于您的平台)自动获取焦点。
解决这个问题的一种方法是:
mediaPlayer.getVideoSurface().requestFocusInWindow();
这意味着当您的窗口被聚焦时,例如点击后,焦点将转移到您的视频表面。
这是测试用例的稳定链接:
Linux上没有必要这样做。
答案 1 :(得分:0)
我正在为寻求像我这样的功能的人更新此功能。 在我使用的当前更新4.2.0中api发生了很大变化之后的4年,您必须执行以下操作
EmbeddedMediaPlayerComponent mpc1 = new EmbeddedMediaPlayerComponent();
mpc1.mediaPlayer().input().enableKeyInputHandling(false);
mpc1.mediaPlayer().input().enableMouseInputHandling(false);
如上所述,这将禁用vlcj视频表面组件中的处理,以后可以按如下使用
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);