当前位置: 首页 > 知识库问答 >
问题:

如何在Java Swing中给使用vlcj播放的视频添加seekbar?

厍浩广
2023-03-14

我把代码删减到了相关部分,并将其发布在下面。代码运行良好。视频在运行时播放,但它没有搜索栏。

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播放器项目。它显示了一个错误,因为它无法解析应该导入的“com.google.common.collect.ImmutableList”。(目前我正在阅读ImmutableList之类的东西,看看是否有办法修复它。)由于我还没弄清楚,我在他们的项目中寻找了一个名为seekbar的类。我找不到。

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

编辑:

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

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

    < li >下载项目。 < li >将其作为Maven项目导入。(导入

就这样。现在您可以正常运行项目了。如果您不知道如何运行项目,就这样做。右键单击项目并选择运行方式

或者,您可以打开 main 方法所在的类并运行它。Vlcj 播放器类是主方法所在的位置。该类位于包中。

我面临的问题是,当我将其作为Maven Install运行时,不知何故,所有必要的文件都没有下载。但它在另一台计算机上工作正常。由于我知道文件下载到哪里,我只是从那台PC复制了文件夹,并将其放在PC的同一位置。文件夹名称为“存储库”。它的位置是 C:\用户\用户名\ .m2。也许日食在这台PC有一些问题。我稍后会重新安装它,以避免将来出现问题。

这可能很有用,这台PC中安装的VLC是64位。不确定这是否会产生差异,但为了以防万一而提及。

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

共有2个答案

上官树
2023-03-14

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

它只需要几行代码。非常简单。这些是您必须遵循的步骤:

  1. 创建一个JSlider。
  2. 在JSlider中,添加一个mouseMotionListener(确切地说是'mouseDraked')。
  3. 在里面输入代码,根据JSlider的变化更新视频位置。
  4. 创建一个计时器。
  5. 将代码放入其中,根据视频的位置设置JSlider的值。

就这样。

这是代码。它包含在初始化()方法中,您可以在我在问题中给出的代码中看到。(当然,您还必须创建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 的价值是国际性的。从 0 到 100。因此,在添加到 JSlider 的鼠标MotionListener 中,我通过将 JSlider 的 int 值除以 100 将其转换为浮动。

在计时器内的动作监听器中,我将视频位置的值乘以100,然后将其四舍五入以使其成为int值。因此,可以在JSlider中设置该值,以使其与视频同步移动。

我敢肯定,代码是初步的,可能有一些我可能没有遵循的最佳实践。很抱歉,我只是通过学习我感兴趣的东西来进入html" target="_blank">java。那些擅长java并在实际项目中使用过此类代码的人可以在下面评论如何改进它。

张岳
2023-03-14

基本控件教程展示了基本方法:在框架中添加一个按钮面板,并为每个按钮提供一个调用相关媒体播放器命令的ActionListener。例如,这个概念上的倒带按钮将“向后跳过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);

软件设计取决于你,但你至少应该意识到

>

  • JToolBar,在这里和这里查看。

    < code>Action,此处可见,此处引用。

    计时器,此处视为重复操作的一种方式。

  •  类似资料:
    • 问题内容: 我有问题 我想在pygame中加载和播放视频,但它没有开始。我唯一看到的是黑屏。这是我的代码: 你能帮助我吗?? 问题答案: 您实际上并没有将其发送到屏幕。您也没有使用时钟对象,因此它将尽可能快地播放。尝试这个: 我只是从评论中提供的链接中获得了MELT.MPG。您应该能够简单地为您要播放的实际MPG切换出该字符串,它就可以工作…也许。

    • 我对录影带所能想象到的知识微乎其微。尽管如此,我正在构建一个需要以下功能的应用程序:给定视频的url,播放视频。这个看似简单的任务对我来说却是非常困难的。下面是我的代码: XML: Java: 下面是我得到的错误: 有趣的是,我可以看到控制肥大底部的VideoView一瞬间。但没有视频播放,只有VideoView的背景显示。有人知道我该怎么解决吗? 一旁 否则,是否有已知的库可以做到这一点?理想情

    • 问题内容: 如何在Swift中使用AV Kit Player View Controller播放视频? 问题答案: 雨燕3.x-5.x 必要: 导入AVKit , 导入AVFoundation 即使使用AVPlayer,也需要AVFoundation框架 如果要使用 AVPlayerViewController : 或只是 AVPlayer : 最好将此代码放入方法中: 覆盖func viewDi

    • 如何在xamariniOS中使用AVPlayerLayer和AVPlayerViewController播放视频?

    • 我试着用两种语言播放一部电影。音频1至扬声器音频2至耳机 播放视频并混合音频1 用audio1播放视频 仅播放音频2 如何结合这一点?

    • 我在一个回收视图中有几张卡片。每张卡都有一个自定义视频视图。单击视频视图,视频应开始。然而,在我的例子中,它只显示蓝色边框,视频没有运行。代码如下所示, 自定义卡视图。xml: 自定义视频视图: 主要活动: activity\u main。xml: 我希望每张卡最初只显示一个缩略图。单击视频后,相关卡应启动视频(不是全部)。视频启动时,VideoView应占据整个屏幕。我怎样才能做到这一点? 谢谢