教你轻松制作java视频播放器

前言

跳过废话,直接看正文

当年入坑Java是因为它的跨平台优势。那时我认为,”编写一次,处处运行。”这听上去多么牛逼,应该是所有语言发展的终极之道,java势必会一统天下。

然而事实证明,那时的我还是太年轻。

正所谓鱼和熊掌不可兼得,若要享受跨平台带来的方便,便不可避免地要接受性能上的不足。事实上,java一直在致力于提高虚拟机的性能(JIT等技术),但面对对实时计算性能要求很高或涉及到用硬件优化的任务(视频的硬件编码、解码)时,仍远远比不上c或c++。因此,很少能够看到有人用java来写这类软件。

回到正题,要想写一个视频播放器,势必要处理不同的视频格式(mp4、avi、rmvb、flv等)。每一类格式的视频都必须要有对应的解码器才能播放。绝大多数解码器的库都是基于效率高的c或c++写成的,用java的写解码器的库非常少。

因此,要想用java写一个视频播放器,只有以下两个选择:

•使用纯java编写,自己编写主流视频格式的软件解码器、结合Java媒体框架(JMF)完成视频解码任务。
 •使用jni调用现有的c或c++的解码器库,完成视频解码任务

使用java自己编写软件解码器的优点是能够真正地实现跨平台,也能很方便灵活地与swing框架结合。然而缺点是太过麻烦,先不说软件解码器的效率问题,各种主流视频格式的解码器的车轮能否成功地重造都是一个值得商榷的问题。

因此,我采用了第二种办法,通过jni调用现有的第三方视频解码库来完成视频解码的任务,而视频的显示、控制的逻辑则交由java来完成。这样便能够实现一个效率较高的视频播放器。值得一提的是,虽然根据平台类型来调用不同平台也能够实现跨平台,但是会受到诸多限制,这是不可避免的。

接下来便来看看具体怎么实现一个视频播放器吧。

正文

解码器的选择

视频格式有很多,解码器也有很多,因此要分别寻找对应的解码器并封装成jni接口进行调用是一个繁琐的任务,因此我们可以找一个已经封装了多种主流解码器的媒体处理框架(视频播放器)的库来直接进行调用。VLC是一个非常好的选择。

VLC media player VLC是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。

在vlc的库上,我们要用jni进行一定的封装,从而能用java来调用视频的解码和播放控制接口。好在我们不必重造车轮。vlcj是一位国外开发者用java开发的一个媒体处理框架,底层使用的正是vlc播放器,通过jni调用vlc来完成音频的解码任务。

开发流程

•安装VLC Media Player(我安装的版本是2.2.4,最好安装到默认目录)
 •建立普通maven项目,添加vlcj的依赖

<dependency>
  <groupId>uk.co.caprica</groupId>
  <artifactId>vlcj</artifactId>
  <version>3.10.1</version>
</dependency>

•正式开发

接下来就是代码干货了,将会介绍三个项目,都是基于这个vlcj的视频播放器。

入门示例

这是vlcj作者提供的入门示例程序,能够快速实现一个简单的视频播放器,当然,仅仅是播放而已,不提供控制功能。
这里用的vlcj中提供的内嵌视频播放组件EmbeddedMediaPlayerComponent,通过其中的mediaPlayer中的playMedia方法可以直接播放视频,视频会渲染到EmbeddedMediaPlayerComponent上。EmbeddedMediaPlayerComponent这个组件中提供了很多其他功能,若要实现一个普通的视频播放器,了解这个组件便足够了。

代码

package tutorial;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

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

public class Tutorial {

  private final JFrame frame;

  private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

  public static void main(final String[] args) {
    new NativeDiscovery().discover();
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new Tutorial(args);
      }
    });
  }

  public Tutorial(String[] args) {
    frame = new JFrame("My First Media Player");
    frame.setBounds(100, 100, 600, 400);
    frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        mediaPlayerComponent.release();
        System.exit(0);
      }
    });
    mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
    frame.setContentPane(mediaPlayerComponent);
    frame.setVisible(true);
    mediaPlayerComponent.getMediaPlayer().playMedia(args[0]);
  }
}

vlcj-player

这是vlcj作者自己基于vlcj写的一个开源播放器,功能很全面,完全可以用来作为平时的视频播放器来使用。由于这个项目内容较多,不便将代码列出。

项目地址详见https://github.com/caprica/vlcj-player

javaplayer

这个是我基于vlcj写的一个简单的视频播放器,支持一些简单的视频播放控制功能和播放弹幕的功能。
开发这个播放器是出于对java编写视频播放器的好奇心,因此没有提供比较完善的功能,毕竟耗时耗力。只是结合了我之前写过的一个弹幕播放器,为这个视频播放器添加了弹幕播放的功能,方便能在播放本地视频的过程中播放b站的弹幕。

项目地址详见https://github.com/clayandgithub/javaplayer

后记

在开发过程中遇到一些坑,如视频渲染组件的透明问题,以及swing的重绘机制导致的一些界面显示上的bug。有些完全解决了,有些则只是采用曲线救国的方法解决的。如果你在开也遇到了这些问题,欢迎一起交流探讨。

附:vlcj的官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用java制作简单的音乐播放器

    本文主要是用到java中的swing技术,以及JMFjar中的API,为大家分享了java音乐播放器的具体实现代码,供大家参考,具体内容如下 备注:需要用JDK1.8才能播放音乐MP3 package baidu; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.media.bean.playerbean.*;

  • 使用JMF实现java视频播放器

    JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mpg,avi,fvl等等,想播放其他的请开发自己的插件,下面将代码贴上去 package com.bird.jmf; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Frame; import java.awt

  • java音乐播放器编写源码

    本文实例为大家分享了java音乐播放器的具体代码,供大家参考,具体内容如下 源码: package baidu; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.media.bean.playerbean.*; //这个包要用到JMF public class MP3 extends JFrame impleme

  • 简单实现java音乐播放器

    学习过java语言的你,或多或少,在某天突发奇想,想着用swing做一个音乐播放器.但是,发现很难找到,相关的java代码,或者你下载的代码有问题,或者你代码里面引入的类包找不到.为了解决自如此类的问题.在这儿,有如下的代码可以供大家参考. package TheMusic; import java.io.*; import javax.sound.sampled.*; public class Music { public static void main(String[] args) { /

  • 教你轻松制作java音乐播放器

    一.音乐播放器的实现原理 Javase的多媒体功能很弱,所以有一个专门处理多媒体的插件叫JMF,JMF提供的模型可大致分为七类 * 数据源(Data source) * 截取设备(Capture Device,包括视频和音频截取设备) * 播放器(Player) * 处理器(Processor) * 数据池(DataSink) * 数据格式(Format) * 管理器(Manager) 而我所做的这个音乐播放器MyMusicPlayer(这是我创建的类名)正是调用了JMF中的Player类来实现

  • Java swing仿酷狗音乐播放器

    今天给大家介绍下用Java swing开发一款音乐播放器,高仿酷狗音乐播放器,完整源码地址在最下方,本文只列出部分源码,因为源码很多,全部贴不下,下面还是老规矩.来看看运行结果: 下面我们来看看代码: 首先看一下主窗口的实现代码: package com.baiting; import java.awt.Dimension; import java.awt.Toolkit; import com.baiting.menu.CloseWindow; /** * 窗口 * @author lmq *

  • java音乐播放器课程设计

    一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计的要求 利用学到的编程知识和编程技巧,要求学生: 1.系统设计要能完成题目所要求的功能,设计的软件可以进行简单的播放及其他基本功能. 2.编程简练,可用,尽可能的使系统的功能更加完善和全面 3.说明书.流程图要清楚. 三.课程设计内容 1.课程设计的题目及简介 音乐播放软件要求: 有图形界面,能播放MP3歌曲,有播放列表,前一首.

  • 一个简单的Java音乐播放器

    本文实例为大家分享了Java音乐播放器展示的具体代码,供大家参考,具体内容如下 package KKMusic; import java.applet.Applet; import java.applet.AudioClip; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.borde

  • 实例解析使用Java实现基本的音频播放器的编写要点

    Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处理方面优势不大,或者说打从Java体系开发时就没太多的考虑音频播放因素,要知道最早的Java 1.1版本中,没有后来的javax.sound包,音频只能通过Applet包调取-- 遗憾的是,在图形程序开发中,我们的程序却又难免要使用到背景音乐.效果音等配合图像操作,哎,这实在是Sun大神给我们开的一个不打不小的玩笑.万幸后来Sun大神开眼,提供了javax.sound包,才解救我们于水深火热当中~ 但是继之而来的问题是,在javax.

  • java音乐播放器实现代码

    本文实例为大家分享了java音乐播放器的具体代码,供大家参考,具体内容如下 这个是源码结构介绍 这个是界面,有点简陋,见笑了,但是基本上的东西都有了,没办法,没有美工的程序写的界面 直接上源代码Player.java package com.service; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import javax.sound

随机推荐