• Java视频播放器的制作


    ----------------siwuxie095

       

       

       

       

       

       

       

    使用 Java Swing 框架制作一个简单的视频播放器:

       

       

    首先到 VideoLAN 的官网下载 VLC media player,制作的视频播放器内核

    需要调用 VLC media player

       

    VideoLAN:http://www.videolan.org/

       

    VLC command-line help:https://wiki.videolan.org/VLC_command-line_help/

       

       

       

    接着下载相关的在线开源库:vlcj

       

    GitHub 链接:https://github.com/caprica/vlcj

       

       

    下载链接:

    1http://capricasoftware.co.uk/#/projects/vlcj

    2http://capricasoftware.co.uk/#/projects/vlcj/tutorial/installation

    3http://download.csdn.net/detail/siwuxie095/9807180

       

       

    vlcj 教程:http://capricasoftware.co.uk/#/projects/vlcj/tutorial

       

       

    vlcj-3.8.0-dist.tar.gz 解压后一览:

       

       

       

       

    必备的 4 个 jar 包:

    1)jna-3.5.2.jar

    2)platform-3.5.2.jar

    3)vlcj-3.8.0.jar

    4)slf4j-api-1.7.10.jar

       

       

       

    虽然这 4 jar 包已经够了,但根据控制台的提示:

    Failed to load class "org.slf4j.impl.StaticLoggerBinder"

       

       

       

       

    最好还是查看具体的细节:https://www.slf4j.org/codes.html#StaticLoggerBinder

       

    可以导入页面中所提到的 5 个包中的任何一个且只能一个来解决问题

    1)slf4j-nop.jar

    2)slf4j-simple.jar

    3)slf4j-log4j12.jar

    4)slf4j-jdk14.jar

    5)logback-classic.jar

       

       

    SLF4J 下载链接:

    1https://www.slf4j.org/download.html

    2http://download.csdn.net/detail/siwuxie095/9807191

       

       

       

    我选择导入 slf4j-nop-1.7.25.jar,即 5 个可选包中的第一个

       

       

       

       

    工程名:MyVideoPlayer

    包名:com.siwuxie095.main、com.siwuxie095.view

    类名:VideoPlayer.java(主类)、MainWindow.java

       

       

    打开资源管理器,在工程 MyVideoPlayer 文件夹下,创建一个

    文件夹:lib,在其中放入:

    1)jna-3.5.2.jar

    2)platform-3.5.2.jar

    3)vlcj-3.8.0.jar

    4)slf4j-api-1.7.10.jar

    5 slf4j-nop-1.7.25.jar

       

       

    工程结构目录如下:

       

       

       

       

    全选这 5 jar 文件,右键->Build Path->Add to Build Path

       

    此时,工程结构目录一览:

       

       

       

       

       

    VideoPlayer.java(主类):

       

    package com.siwuxie095.main;

       

    import java.awt.EventQueue;

    import java.io.File;

       

    import javax.swing.JFileChooser;

    import javax.swing.SwingWorker;

       

    import com.siwuxie095.view.MainWindow;

    import com.sun.jna.Native;

    import com.sun.jna.NativeLibrary;

       

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

    import uk.co.caprica.vlcj.discovery.NativeDiscovery;

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

       

    public class VideoPlayer {

     

    /**

    * VLC播放器系统库的路径:D:VLC media playerVLC

    * 注意需要将路径中的反斜杠改为斜杠,或 使用双反斜杠(即通过转义符进行转义)

    * 系统库一般是在含有 libvlc.dlllibvlccore.dll 的路径

    */

    private static final String NATIVE_LIBRARY_SEARCH_PATH = "D:/VLC media player/VLC";

     

    //将声明转移到类中,并设为 static

    static MainWindow frame;

       

     

    public static void main(String[] args) {

     

    //(1)法一:首先要找到本机库(VLC播放器的系统库),这是自动搜索本机库的位置

    boolean found = new NativeDiscovery().discover();

    System.out.println(found);

    System.out.println(LibVlc.INSTANCE.libvlc_get_version());

       

       

    //判断当前的系统是否是Windows

    //还可以判断MacLinux,以传入不同的路径

    if (RuntimeUtil.isWindows()) {

     

    //(2)法二:手动设置本机库(VLC播放器的系统库)的路径

    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(),

    NATIVE_LIBRARY_SEARCH_PATH);

     

    System.out.println(LibVlc.INSTANCE.libvlc_get_version());

    }

       

    //加载VLC播放器的系统库

    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

     

     

    //在主方法中创建窗体

    EventQueue.invokeLater(new Runnable() {

    public void run() {

    try {

    frame = new MainWindow();

    frame.setVisible(true);

    //字幕的编码

    String options="--subsdec-encoding=GB18030";

    /**

    * prepareMedia() 先准备而不是马上播放

    * 可传入视频文件的路径(和播放参数,如:字幕编码)

    * 这里使用双反斜杠(通过转义符进行转义)

    * 关于播放参数,可以参考 VLC command-line

    * 链接:https://wiki.videolan.org/VLC_command-line_help/

    * 进入后搜索 subsdec 设定字幕编码

    * 还可以传入更多播放参数

    */

    frame.getMediaPlayer().prepareMedia("C:\Users\siwux\Desktop\"

    + "testvideo\test.mp4",options);

     

    frame.getMediaPlayer().toggleFullScreen();

     

    //创建一个 SwingWorker 线程,用于实时调节进度

    //注意:创建完毕,最后要 execute() 将它运行起来

    new SwingWorker<String, Integer>() {

       

    @Override

    protected String doInBackground() throws Exception {

     

    while (true) {

    //视频总时长,以毫秒计

    long total=frame.getMediaPlayer().getLength();

    //当前所看时长,以毫秒计

    long curr=frame.getMediaPlayer().getTime();

    //百分比,并强转为 float

    float percent=(float)curr/total;

    //因为进度条不是按百分比进行计算,而是 0-100 的数值范围

    //所以要乘 100,并强转为 intpublish() process()

    //(进度条范围可设置,如果改为 0-120,就要乘 120)

    publish((int)(percent*100));

     

    //每隔 0.1 (100毫秒)更新一次进度条,如果不加则刷新过快

    Thread.sleep(100);

    }

     

    }

     

    protected void process(java.util.List<Integer> chunks) {

    //创建int型变量 value 接收 chunks 中的值

    for (int value : chunks) {

    frame.getProgressBar().setValue(value);

    }

     

    };

    }.execute();

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    });

     

    }

     

     

    //播放

    public static void play() {

    frame.getMediaPlayer().play();

    }

     

    //暂停

    public static void pause() {

    frame.getMediaPlayer().pause();

    }

     

    //停止

    public static void stop() {

    frame.getMediaPlayer().stop();

    }

     

     

    public static void jumpTo(float to) {

    //为跳转设定时间:百分比乘以视频时间的总长

    frame.getMediaPlayer().setTime((long)(to*frame.getMediaPlayer().getLength()));

    }

     

    public static void openVideo() {

    //创建文件选择器:JFileChooser

    JFileChooser chooser=new JFileChooser();

    //将父级窗体设置成 null

    int v=chooser.showOpenDialog(null);

    if (v==JFileChooser.APPROVE_OPTION) {

    File file=chooser.getSelectedFile();

    //获取到文件的绝对路径,开始播放

    frame.getMediaPlayer().playMedia(file.getAbsolutePath());

    }

    }

     

    public static void openSubtitle() {

    JFileChooser chooser=new JFileChooser();

    int v=chooser.showOpenDialog(null);

    if (v==JFileChooser.APPROVE_OPTION) {

    File file=chooser.getSelectedFile();

    //设定字幕,直接传入 file 对象

    frame.getMediaPlayer().setSubTitleFile(file);

    }

    }

     

    public static void exit() {

    //在退出之前,先释放播放器的资源

    frame.getMediaPlayer().release();

    System.exit(0);

    }

     

    public static void setVol(int vol) {

    //设定音量

    frame.getMediaPlayer().setVolume(vol);

    }

     

    }

       

       

       

    MainWindow.java:

       

    package com.siwuxie095.view;

       

    import java.awt.BorderLayout;

    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    import java.awt.event.MouseAdapter;

    import java.awt.event.MouseEvent;

       

    import javax.swing.JButton;

    import javax.swing.JFrame;

    import javax.swing.JMenu;

    import javax.swing.JMenuBar;

    import javax.swing.JMenuItem;

    import javax.swing.JPanel;

    import javax.swing.JProgressBar;

    import javax.swing.JSlider;

    import javax.swing.UIManager;

    import javax.swing.UnsupportedLookAndFeelException;

    import javax.swing.border.EmptyBorder;

    import javax.swing.event.ChangeEvent;

    import javax.swing.event.ChangeListener;

       

    import com.siwuxie095.main.VideoPlayer;

    import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

       

    import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;

    import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;

       

    public class MainWindow extends JFrame {

       

    private JPanel contentPane;

     

    //创建播放器的界面需要使用 EmbeddedMediaPlayerComponent

    EmbeddedMediaPlayerComponent playerComponent;

     

    private JPanel bottomPane;

    private JButton btnPlay;

    private JButton btnPause;

    private JButton btnStop;

    private JPanel controlPane;

    private JProgressBar progress;

    private JMenuBar menuBar;

    private JMenu mnFile;

    private JMenuItem mntmOpenvideo;

    private JMenuItem mntmOpensubtitle;

    private JMenuItem mntmExit;

    private JSlider slider;

       

       

    /**

    * Create the frame.

    */

    public MainWindow() {

     

    try {

    UIManager.setLookAndFeel(new WindowsLookAndFeel());

    } catch (UnsupportedLookAndFeelException e) {

    e.printStackTrace();

    }

     

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setBounds(100, 100, 450, 300);

     

    menuBar = new JMenuBar();

    setJMenuBar(menuBar);

     

    mnFile = new JMenu("File");

    menuBar.add(mnFile);

     

    mntmOpenvideo = new JMenuItem("OpenVideo");

    mntmOpenvideo.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

    VideoPlayer.openVideo();

    }

    });

    mnFile.add(mntmOpenvideo);

     

    mntmOpensubtitle = new JMenuItem("OpenSubtitle");

    mntmOpensubtitle.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

    VideoPlayer.openSubtitle();

    }

    });

    mnFile.add(mntmOpensubtitle);

     

    mntmExit = new JMenuItem("Exit");

    mntmExit.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {

    VideoPlayer.exit();

    }

    });

    mnFile.add(mntmExit);

    contentPane = new JPanel();

    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

    contentPane.setLayout(new BorderLayout(0, 0));

    setContentPane(contentPane);

     

    JPanel videoPane = new JPanel();

    contentPane.add(videoPane, BorderLayout.CENTER);

    videoPane.setLayout(new BorderLayout(0, 0));

     

    // videoPane 创建之后实例化 playerComponent

    playerComponent=new EmbeddedMediaPlayerComponent();

    // playerComponent 添加到 videoPane 中,并指定布局

    videoPane.add(playerComponent, BorderLayout.CENTER);

     

    bottomPane = new JPanel();

    videoPane.add(bottomPane, BorderLayout.SOUTH);

    bottomPane.setLayout(new BorderLayout(0, 0));

     

    controlPane = new JPanel();

    bottomPane.add(controlPane);

     

    btnStop = new JButton("Stop");

    controlPane.add(btnStop);

    btnStop.setFocusable(false);

     

    btnPlay = new JButton("Play");

    controlPane.add(btnPlay);

    btnPlay.setFocusable(false);

     

    btnPause = new JButton("Pause");

    controlPane.add(btnPause);

    btnPause.setFocusable(false);

     

    slider = new JSlider();

    slider.setFocusable(false);

    //关于默认音量的设定要在 stateChanged 事件之前

    //如果要设定最大音量和最小音量也是如此

    slider.setValue(20);

    //为音量调节 slider 添加 stateChanged 事件

    slider.addChangeListener(new ChangeListener() {

    public void stateChanged(ChangeEvent e) {

    VideoPlayer.setVol(slider.getValue());

    }

    });

     

     

    controlPane.add(slider);

     

    progress = new JProgressBar();

    progress.setFocusable(false);

     

    //为进度条 progress 添加 mouseClicked 事件

    progress.addMouseListener(new MouseAdapter() {

    @Override

    public void mouseClicked(MouseEvent e) {

    //获取鼠标点击在进度条上的位置

    int x=e.getX();

    //计算点击位置占进度条总长的百分比

    float per=(float)x/progress.getWidth();

    VideoPlayer.jumpTo(per);

    }

    });

    //让进度条 progress 显示数字百分比

    progress.setStringPainted(true);

    bottomPane.add(progress, BorderLayout.NORTH);

     

     

    // Stop 按钮添加 mouseClicked 事件

    btnStop.addMouseListener(new MouseAdapter() {

    @Override

    public void mouseClicked(MouseEvent e) {

    VideoPlayer.stop();

    }

    });

     

       

    // Play 按钮添加 mouseClicked 事件

    btnPlay.addMouseListener(new MouseAdapter() {

    @Override

    public void mouseClicked(MouseEvent e) {

    VideoPlayer.play();

    }

    });

     

     

    // Pause 按钮添加 mouseClicked 事件

    btnPause.addMouseListener(new MouseAdapter() {

    @Override

    public void mouseClicked(MouseEvent e) {

    VideoPlayer.pause();

    }

    });

     

    }

     

     

    //返回媒体播放器的实例

    public EmbeddedMediaPlayer getMediaPlayer() {

    return playerComponent.getMediaPlayer();

    }

     

     

    //返回JProgressBar的实例

    public JProgressBar getProgressBar() {

    return progress;

    }

       

    }

       

       

       

    将窗体 JFrame 的 LookAndFeel 设定为 Windows

       

       

    根面板 contentPane 使用默认布局 Border Layout

       

       

    在 contentPane 的中间添加一个 JPanel,将其布局改为:

    Border Layout,Rename 为 videoPane

       

       

    在 videoPane 的下方添加一个 JPanel,将其布局改为:

    Border Layout,Rename 为 bottomPane

       

       

    在 bottomPane 的中间添加一个 JPanel,将其布局改为:

    Flow Layout,Rename 为 controlPane

       

       

    在 controlPane 中添加三个 JButton 和一个 JSlider

       

       

    将三个 JButton 的 focusable 属性设为 false,并将其文本(text)分别改为:

    Stop、Play 和 Pause,再分别 Rename 为:btnStop、btnPlay 和 btnPause

       

       

    为三个 JButton 添加 mouseClicked 事件,实现对应 停止、播放 和 暂停 的功能

       

       

    Slider 的 focusable 属性设为 false

       

       

    JSlider 添加 stateChanged 事件,实现 调节音量 的功能

       

       

    bottomPane 的上方添加一个 JProgressBar

       

       

    JProgressBar 的 focusable 属性设为 false,stringPainted 属性设为 true,

    并 Rename 为:progress

       

       

    为 JProgressBar 添加 mouseClicked 事件,实现 调节进度 的功能

       

       

    JFrame 的上方添加一个 JMenuBar,注意:JMenuBar 和 contentPane 同级

       

       

    制作 菜单栏,为 菜单项 添加 actionPerformed 事件,实现

    打开视频、打开字幕 和 退出 的功能

       

       

       

    整体的 Components 视图:

       

       

       

       

    运行程序:

       

       

       

       

       

       

    最后导出为可执行的 Java 程序:

    选择工程 MyVideoPlayer,右键->Export->Java->Runnable JAR file

       

    然后选择当前主类:VideoPlayer - MyVideoPlayer,导出

    路径指定为:E:workspaceMyVideoPlayer elease,并

    命名为:MyVideoPlayer.jar

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    数据库生成说明
    Android 的 SurfaceView 双缓冲应用
    一些and知识 和ui
    weibo11
    android总结
    weibo14
    weibo9
    weibo12
    weibo10
    在线人数的统计
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6681130.html
Copyright © 2020-2023  润新知