如何在Java Swing中使用vlcj为视频添加搜索栏?

时间:2017-08-07 20:32:05

标签: java swing video seekbar vlcj

我已将代码仅删除相关部分并将其发布在下方。代码工作正常。运行视频时会播放该视频,但它没有搜索栏。

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安装
  4. 就是这样。现在您可以正常运行该项目。如果您不知道如何运行项目,请执行此操作。右键单击该项目,然后选择Run As> Java Application然后选择VlcjPlayer - uk.co.caprica.vlcplayer。

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

    我遇到的问题是,当我将其作为Maven Install运行时,所有必要的文件都没有被下载。但它在另一台电脑上运行良好。由于我知道文件的下载位置,我只是从该PC复制了该文件夹并将其放在我的PC中的相同位置。文件夹名称是“repository”。它的位置是C:\ Users \ User Name \ .m2。也许Eclipse在这台PC上有一些问题。我稍后会重新安装它以避免将来出现问题。

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

    既然应用程序运行正常,我将看到代码,看看如何制作搜索栏。非常感谢@caprica告诉我应该将它作为Maven项目导入。 :)

2 个答案:

答案 0 :(得分: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);

软件设计取决于您,但您至少应该了解

答案 1 :(得分:0)

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

只需几行代码即可。这很简单。 这些是您必须遵循的步骤:

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

    这是代码。它位于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.

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

    我确信这些代码很简陋,可能会有一些我可能没有遵循的最佳实践。对此感到抱歉,我只是通过学习我觉得有趣的东西进入java。那些擅长java并在实际项目中使用过这些代码的人可以在下面评论如何改进它。