如何在 Java Swing 中使用 vlcj 播放的视频添加搜索栏?
How to add a seekbar to a video played using vlcj in Java Swing?
我已将代码精简为仅相关部分并将其发布在下方。该代码工作正常。当您 运行 但它没有搜索栏时,视频会播放。
public class Screen {
//JFrmae
private JFrame frame;
// Panel which I add the canvas to
private JPanel pVid = new JPanel();
// Canvas
Canvas canvas = new Canvas();
// Embedded Media Player
EmbeddedMediaPlayer emp;
/**
* Create the application.
*/
public Screen() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
//Frame
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
//Adding the panel to the frame
frame.getContentPane().add(pVid);
//Adding the canvas to the panel
pVid.add(canvas);
//Setting canvas size
canvas.setSize(715, 402);
//Loading the VLC native library
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "lib");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
//Initializing the media player
MediaPlayerFactory mpf = new MediaPlayerFactory();
//Misc
emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
//Video file name and playing
String file = "video.mp4";
emp.prepareMedia(file);
emp.play();
//pack method
frame.pack();
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Screen window = new Screen();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
过去 4 天我一直在网上寻找答案。最后我决定在这里问。 vlcj 的官方网站上有他们制作的 vlcj 播放器的图片。这些图片中有一个搜索栏。 Link到有图片的网页:http://capricasoftware.co.uk/#/projects/vlcj
他们那里有很多有用的教程,但没有任何关于添加搜索栏的说明。
然后我尝试从他们的 GitHub 页面下载他们的 vlcj-player 项目。它显示错误,因为它无法解析应该导入的“com.google.common.collect.ImmutableList”。 (目前我正在阅读有关 ImmutableList 的内容,看看是否有办法修复它。)由于我还没有弄清楚,我在他们的项目中寻找了一个名为 seekbar 或类似的 class .我找不到任何。
我也在网上其他地方搜索了答案,但就是找不到。我真的很感激任何帮助。谢谢。
编辑:
(此编辑是对@caprica 给我的建议的回应。阅读他们对这个问题的评论以及我在评论中对此的回复,以了解我在此编辑中所说的内容。我认为将来对其他人有用。)
好的,一定是我的 Eclipse 或电脑出了问题。 (我会在评论的最后写出我是如何修复它的。)它现在正在工作。我将逐步输入我所做的事情,以便将来下载和安装该项目可能对其他人有用。
- 下载项目。
- 将其导入为 Maven 项目。 (导入 > Maven > 现有 Maven 项目)
- 现在在 Eclipse 中右键单击导入的项目,然后 select 运行 As > Maven Install
就是这样。现在你可以正常 运行 项目了。如果您不知道如何 运行 该项目,请这样做。右击项目然后 select 运行 As > Java Application 然后 Select VlcjPlayer – uk.co.caprica.vlcplayer.
或者您可以打开主要方法所在的 class 和 运行 它。 VlcjPlayerclass是main方法所在的地方。 class 在包 uk.co.caprica.vlcplayer.
中
我遇到的问题是,当我 运行 作为 Maven 安装时,所有必需的文件都没有下载。但它在另一台电脑上运行良好。因为我知道文件下载到哪里,所以我只是从那台电脑上复制了文件夹,然后把它放在我电脑上的同一个地方。文件夹名称是“存储库”。它的位置是 C:\Users\User Name\.m2。也许这台 PC 中的 Eclipse 有问题。我稍后会重新安装它以避免将来出现问题。
这可能会有用,这台电脑上安装的 VLC 是 64 位的。不确定这是否有所作为,但以防万一。
既然应用程序运行良好,我将查看代码并查看搜索栏是如何制作的。非常感谢@caprica 告诉我应该将其作为 Maven 项目导入。 :)
Basic Controls 教程展示了基本方法:向框架添加一个按钮面板,并为每个按钮提供一个 ActionListener
以调用相关的媒体播放器命令。例如,这个概念上的 Rewind 按钮将 "skip backwards 10 seconds (-10,000 milliseconds)."
JPanel controlsPane = new JPanel();
JButton rewindButton = new JButton("Rewind");
rewindButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mediaPlayerComponent.getMediaPlayer().skip(-10000);
}
});
controlsPane.add(rewindButton);
frame.add(controlsPane, BorderLayout.SOUTH);
软件设计由你决定,但你至少应该知道
好的,伙计们。我已经知道怎么做了。我不确定它在官方 Vlcj 项目中是如何完成的,但我已经通过从官方项目中学习找到了我自己的简单方法。
只需几行代码。这很简单。
这些是您必须遵循的步骤:
- 创建一个 JSlider。
- 向 JSlider 添加一个 mouseMotionListener(准确地说是“mouseDragged”)。
- 在其中放入将根据以下内容更新视频位置的代码
JSlider 中的更改。
- 创建一个计时器。
- 把代码放在里面,根据位置设置JSlider的值
视频。
就是这样!
这是代码。它位于 initialize() 方法中,您可以在我在问题中给出的代码中看到该方法。 (当然,您还必须创建 JSlider 并将其添加到面板。我没有显示代码,因为它很简单。)
js.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (js.getValue() / 100 < 1) {
emp.setPosition((float) js.getValue() / 100);
}
}
});
Timer timer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
js.setValue(Math.round(emp.getPosition() * 100));
}
});
timer.start();
一些解释。
使用emp.getPosition时得到的值似乎总是小数。它在视频开头类似于 0.1334344,在结尾处类似于 0.998988。但是JSlider的值是int。从 0 到 100。所以在添加到 JSlider 的 mouseMotionListener 中,我通过将 JSlider 的 int 值除以 100 将其转换为 float。
在计时器内的动作侦听器中,我将视频位置的值乘以 100,然后四舍五入,使其成为一个 int 值。因此可以在 JSlider 中设置该值,使其与视频同步移动。
我确定代码是基本的,并且可能有一些我可能没有遵循的最佳实践。抱歉,我只是通过学习我觉得有趣的东西来进入 java。擅长 java 并在实际项目中使用过此类代码的朋友可以在下方评论,指出如何改进。
我已将代码精简为仅相关部分并将其发布在下方。该代码工作正常。当您 运行 但它没有搜索栏时,视频会播放。
public class Screen {
//JFrmae
private JFrame frame;
// Panel which I add the canvas to
private JPanel pVid = new JPanel();
// Canvas
Canvas canvas = new Canvas();
// Embedded Media Player
EmbeddedMediaPlayer emp;
/**
* Create the application.
*/
public Screen() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
//Frame
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
//Adding the panel to the frame
frame.getContentPane().add(pVid);
//Adding the canvas to the panel
pVid.add(canvas);
//Setting canvas size
canvas.setSize(715, 402);
//Loading the VLC native library
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "lib");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
//Initializing the media player
MediaPlayerFactory mpf = new MediaPlayerFactory();
//Misc
emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
//Video file name and playing
String file = "video.mp4";
emp.prepareMedia(file);
emp.play();
//pack method
frame.pack();
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Screen window = new Screen();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
过去 4 天我一直在网上寻找答案。最后我决定在这里问。 vlcj 的官方网站上有他们制作的 vlcj 播放器的图片。这些图片中有一个搜索栏。 Link到有图片的网页:http://capricasoftware.co.uk/#/projects/vlcj
他们那里有很多有用的教程,但没有任何关于添加搜索栏的说明。
然后我尝试从他们的 GitHub 页面下载他们的 vlcj-player 项目。它显示错误,因为它无法解析应该导入的“com.google.common.collect.ImmutableList”。 (目前我正在阅读有关 ImmutableList 的内容,看看是否有办法修复它。)由于我还没有弄清楚,我在他们的项目中寻找了一个名为 seekbar 或类似的 class .我找不到任何。
我也在网上其他地方搜索了答案,但就是找不到。我真的很感激任何帮助。谢谢。
编辑:
(此编辑是对@caprica 给我的建议的回应。阅读他们对这个问题的评论以及我在评论中对此的回复,以了解我在此编辑中所说的内容。我认为将来对其他人有用。)
好的,一定是我的 Eclipse 或电脑出了问题。 (我会在评论的最后写出我是如何修复它的。)它现在正在工作。我将逐步输入我所做的事情,以便将来下载和安装该项目可能对其他人有用。
- 下载项目。
- 将其导入为 Maven 项目。 (导入 > Maven > 现有 Maven 项目)
- 现在在 Eclipse 中右键单击导入的项目,然后 select 运行 As > Maven Install
就是这样。现在你可以正常 运行 项目了。如果您不知道如何 运行 该项目,请这样做。右击项目然后 select 运行 As > Java Application 然后 Select VlcjPlayer – uk.co.caprica.vlcplayer.
或者您可以打开主要方法所在的 class 和 运行 它。 VlcjPlayerclass是main方法所在的地方。 class 在包 uk.co.caprica.vlcplayer.
中我遇到的问题是,当我 运行 作为 Maven 安装时,所有必需的文件都没有下载。但它在另一台电脑上运行良好。因为我知道文件下载到哪里,所以我只是从那台电脑上复制了文件夹,然后把它放在我电脑上的同一个地方。文件夹名称是“存储库”。它的位置是 C:\Users\User Name\.m2。也许这台 PC 中的 Eclipse 有问题。我稍后会重新安装它以避免将来出现问题。
这可能会有用,这台电脑上安装的 VLC 是 64 位的。不确定这是否有所作为,但以防万一。
既然应用程序运行良好,我将查看代码并查看搜索栏是如何制作的。非常感谢@caprica 告诉我应该将其作为 Maven 项目导入。 :)
Basic Controls 教程展示了基本方法:向框架添加一个按钮面板,并为每个按钮提供一个 ActionListener
以调用相关的媒体播放器命令。例如,这个概念上的 Rewind 按钮将 "skip backwards 10 seconds (-10,000 milliseconds)."
JPanel controlsPane = new JPanel();
JButton rewindButton = new JButton("Rewind");
rewindButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mediaPlayerComponent.getMediaPlayer().skip(-10000);
}
});
controlsPane.add(rewindButton);
frame.add(controlsPane, BorderLayout.SOUTH);
软件设计由你决定,但你至少应该知道
好的,伙计们。我已经知道怎么做了。我不确定它在官方 Vlcj 项目中是如何完成的,但我已经通过从官方项目中学习找到了我自己的简单方法。
只需几行代码。这很简单。 这些是您必须遵循的步骤:
- 创建一个 JSlider。
- 向 JSlider 添加一个 mouseMotionListener(准确地说是“mouseDragged”)。
- 在其中放入将根据以下内容更新视频位置的代码 JSlider 中的更改。
- 创建一个计时器。
- 把代码放在里面,根据位置设置JSlider的值 视频。
就是这样!
这是代码。它位于 initialize() 方法中,您可以在我在问题中给出的代码中看到该方法。 (当然,您还必须创建 JSlider 并将其添加到面板。我没有显示代码,因为它很简单。)
js.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (js.getValue() / 100 < 1) {
emp.setPosition((float) js.getValue() / 100);
}
}
});
Timer timer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
js.setValue(Math.round(emp.getPosition() * 100));
}
});
timer.start();
一些解释。
使用emp.getPosition时得到的值似乎总是小数。它在视频开头类似于 0.1334344,在结尾处类似于 0.998988。但是JSlider的值是int。从 0 到 100。所以在添加到 JSlider 的 mouseMotionListener 中,我通过将 JSlider 的 int 值除以 100 将其转换为 float。
在计时器内的动作侦听器中,我将视频位置的值乘以 100,然后四舍五入,使其成为一个 int 值。因此可以在 JSlider 中设置该值,使其与视频同步移动。
我确定代码是基本的,并且可能有一些我可能没有遵循的最佳实践。抱歉,我只是通过学习我觉得有趣的东西来进入 java。擅长 java 并在实际项目中使用过此类代码的朋友可以在下方评论,指出如何改进。