通过Java利用vlc实现视频播放器

        好久没写东西了,最近也开始整理自己曾经学过的东西。在整理的过程中,我将会每周更新一些Java开发的过程中可能会用到的技术,比如,视频播放、office文档处理、二维码的生成和解析等技术。

       本期,与大家分享的是利用vlc实现视频播放器的技术。首先大概介绍一下vlc,简单来说,vlc是一个通用的开源的视频播放软件,它的官网是:https://www.videolan.org/vlc/。而我们现在使用的是vlcj,一个在Java里嵌入VLC的解决方案,它的官方文档是https://github.com/caprica/vlcjhttp://capricasoftware.co.uk/projects/vlcj-4/tutorials

     下面进入正题,首先我们准备项目需要的jar包和vlc软件,vlc-3.0.6-win64和相关的jar,他们可以通过官方文档进行下载,当然也可以通过此链接下载,当把相关东西下载好之后,废话不多说,直接上代码。

第一个类文件:

package my;

import java.io.File;

import com.sun.jna.NativeLibrary;

import uk.co.caprica.vlcj.binding.RuntimeUtil;

public class App
{
    public static void creatGUI()
    {
        AppFrame frame = new AppFrame();
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        File vlcRoot = new File("C:\\Users\\andy\\Desktop\\02 视频播放\\(2) 项目准备\\vlcj\\vlc-3.0.6");
        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName()
                        ,vlcRoot.getAbsolutePath() );
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            

            @Override
            public void run()
            {
                // TODO Auto-generated method stub
                creatGUI();
            }
        });

    }

}
第二类文件

package my;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.LayoutManager;
import java.io.File;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.filechooser.FileNameExtensionFilter;

import uk.co.caprica.vlcj.media.MediaRef;
import uk.co.caprica.vlcj.media.TrackType;
import uk.co.caprica.vlcj.player.base.MediaPlayer;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter;
import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;

public class AppFrame extends JFrame
{
    // VLC控件
    private EmbeddedMediaPlayerComponent vlc;

    // 几个控件
    JTextField pathField = new JTextField();
    JButton openButton = new JButton("...");
    
    // 进度显示
    JSlider slider = new JSlider();
    
    public AppFrame()
    {
        super("视频播放测试");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(640, 400);

        // Content Pane
        JPanel root = new JPanel();
        this.setContentPane(root);
        root.setLayout(new BorderLayout());

        // 创建一个VLC控件
        vlc = new EmbeddedMediaPlayerComponent();
        root.add(vlc, BorderLayout.CENTER);

        // 添加按钮控制
        JPanel buttons = new JPanel();
        root.add(buttons, BorderLayout.PAGE_START);

        buttons.setLayout(new FlowLayout());
        openButton.setFocusPainted(false);
        buttons.add(pathField);
        buttons.add(openButton);

        // 选择视频文件,进行播放
        openButton.addActionListener((e) -> {
            openMedia();

        });
        //播放进度
        Box bottom = Box.createVerticalBox();
        bottom.add(slider);
        slider.setMinimum(0);
        slider.setMaximum(100);
        slider.setValue(0);
        root.add(bottom , BorderLayout.PAGE_END);
        //初始化vlc
        initVlcPlayer();
        
    }
    //初始化vlc
    private void initVlcPlayer()
    {
        //播放视频中的几个事件
        vlc.mediaPlayer().events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {

            @Override
            public void error(MediaPlayer mediaPlayer)
            {
                // TODO Auto-generated method stub
                super.error(mediaPlayer);
            }

            @Override
            public void finished(MediaPlayer mediaPlayer)
            {
                System.out.println("finished ...");
            }

            @Override
            public void lengthChanged(MediaPlayer mediaPlayer, long newLength)
            {
                // TODO Auto-generated method stub
                super.lengthChanged(mediaPlayer, newLength);
            }

            @Override
            public void playing(MediaPlayer mediaPlayer)
            {
                System.out.println("playing ...");
            }

            @Override
            public void positionChanged(MediaPlayer mediaPlayer, float newPosition)
            {
                System.out.println("positionChanged.. " + newPosition);
                slider.setValue( (int)(100 * newPosition));
            }

            @Override
            public void timeChanged(MediaPlayer mediaPlayer, long newTime)
            {
                // TODO Auto-generated method stub
                super.timeChanged(mediaPlayer, newTime);
            }
            
        });
        
    }

    private void openMedia()
    {
        JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("视频", "mp4", "avi", "wmv");
        chooser.setFileFilter(filter);

        int ret = chooser.showOpenDialog(this);
        if (ret == JFileChooser.APPROVE_OPTION)
        {
            // 结果为:已经存在的一个文件
            File file = chooser.getSelectedFile();
            pathField.setText(file.getAbsolutePath());

            // 开始播放视频
            vlc.mediaPlayer().media().play(file.getAbsolutePath());
        }
    }
    
    
}
最后,这个例子是基于swing写的,仅供参考。欢迎大家指出不足。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AndyWei147

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值