【问题标题】:How to add a seekbar to a video played using vlcj in Java Swing?如何在 Java Swing 中使用 vlcj 播放的视频中添加搜索栏?
【发布时间】:2017-08-07 20:32:05
【问题描述】:

我已将代码缩减为仅相关部分并将其发布在下面。代码工作正常。视频在您运行时播放,但没有搜索栏。

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 播放器的图片。这些图片中有一个搜索栏。有图片的网页链接:http://capricasoftware.co.uk/#/projects/vlcj

那里有许多有用的教程,但没有任何添加搜索栏的说明。

然后我尝试从他们的 GitHub 页面下载他们的 vlcj-player 项目。它显示了一个错误,因为它无法解析应该导入的“com.google.common.collect.ImmutableList”。 (目前我正在阅读有关 ImmutableList 之类的内容,看看是否有办法修复它。)由于我还无法弄清楚,我在他们的项目中寻找了一个名为 seekbar 之类的类。我找不到任何东西。

我还在网上其他地方搜索过答案,但我就是找不到。我真的很感激任何帮助。谢谢。

编辑:

(此编辑是对@caprica 给我的建议的回应。阅读他们对这个问题的评论以及我在评论中对此的回复,以了解我在此编辑中所说的内容。我认为它将来对其他人有用。)

好吧,我的 Eclipse 或计算机一定有问题。 (我将在此评论的末尾输入我是如何修复它的。)它现在正在工作。我将逐步输入我所做的事情,以便将来下载和安装该项目对其他人有用。

  1. 下载项目。
  2. 将其作为 Maven 项目导入。 (导入 > Maven > 现有 Maven 项目)
  3. 现在在 Eclipse 中右键单击导入的项目并选择 Run As > Maven Install

就是这样。现在你可以正常运行项目了。如果您不知道如何运行该项目,请这样做。右键单击项目并选择 Run As > Java Application 然后选择 VlcjPlayer – uk.co.caprica.vlcplayer。

或者,您可以打开 main 方法所在的类并运行它。 VlcjPlayer 类是 main 方法所在的地方。该类位于包 uk.co.caprica.vlcplayer 中。

我遇到的问题是,当我以 Maven Install 运行它时,不知何故所有必要的文件都没有下载。但它在另一台计算机上运行良好。因为我知道文件下载到哪里,所以我只是从那台 PC 复制文件夹并将其放在我 PC 的同一个位置。文件夹名称为“存储库”。它的位置是 C:\Users\User Name\ .m2。也许这台 PC 中的 Eclipse 有一些问题。我稍后会重新安装它以避免将来出现问题。

这可能很有用,这台 PC 上安装的 VLC 是 64 位的。不确定这是否有所作为,但以防万一。

现在应用程序运行良好,我将查看代码并查看搜索栏是如何制作的。非常感谢 @caprica 告诉我我应该将它作为 Maven 项目导入。 :)

【问题讨论】:

  • 您需要的一切都在 vlcj-player 项目中,将该项目作为 Maven 项目从 Github 导入您的 IDE,您应该没问题(您的 Google 收藏库问题应该会自动解决)。正确实现搜索栏有一些技巧,您可以通过查找 PositionPane 类开始该项目
  • @caprica,我将项目作为 Maven 项目导入 Eclipse。我仍然得到确切的错误。为了确定,我试了几次。不太清楚为什么我仍然收到错误。
  • 我欢迎@caprica 的观点;我的目标是在 Swing 设计的背景下引用基本教程。
  • @caprica,我的 Eclipse 似乎有问题。该项目现在没有显示任何错误。我已经在我的问题中输入了它是如何修复的,以供其他人查看。非常感谢。 :)

标签: java swing video seekbar vlcj


【解决方案1】:

Basic Controls 教程展示了基本方法:向框架中添加一个按钮面板,并为每个按钮提供一个调用相关媒体播放器命令的ActionListener。例如,这个名义上的 Rewind 按钮将“向后跳过 10 秒(-10,000 毫秒)。”

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);

软件设计取决于你,但你至少应该知道

【讨论】:

  • 一个很大的障碍是我不知道我必须创建的组件的名称。我实际上已经想出了如何制作暂停和跳过按钮。因为我知道我必须创建 JButton 并使用 ActionListener 等。但是对于搜索栏,我真的不知道我应该创建什么。
  • @caprica 可能有更好的东西,但我会让Timer 调用skip;每 250 毫秒跳过一秒将是 4 倍。
  • 这很整洁。谢谢。如果我不知道如何从项目中制作搜索栏,我会听从你的建议。谢谢。
  • skipPosition() 的方法看起来也很有希望;如果一段时间后没有好转,您可以点击左侧的empty check mark 接受此答案。
  • 是的,当然。如果我不知道如何制作搜索栏,我会这样做。谢谢。 :)
【解决方案2】:

好吧,伙计们。我已经想出办法了。我不确定它是如何在官方 Vlcj 项目中完成的,但我通过从官方项目中学习找到了自己的简单方法。

只需要几行代码。这很简单。 以下是您必须遵循的步骤:

  1. 创建一个 JSlider。
  2. 在 JSlider 中添加一个 mouseMotionListener(确切地说是“mouseDragged”)。
  3. 在其中放入将根据以下内容更新视频位置的代码 JSlider 的变化。
  4. 创建一个计时器。
  5. 将代码放入其中,根据位置设置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并在实际项目中使用过此类代码的人可以在下面评论如何改进它。

【讨论】:

  • 聆听来自媒体播放器的“位置改变”事件,然后在 UI 线程上更新您的滑块,这比 IMO 每 100 毫秒轮询一次媒体播放器要好。
  • 听起来好多了。所以为此我必须创建一个自定义侦听器对吗?我现在已经寻找并找到了一些关于它的教程。我将学习如何做到这一点并在此处的答案中更新它。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2016-02-04
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多