Предыстория


(можно сразу пропустить и перейти к следующему пункту)

При изучении Java, сразу после того как освоил Swing стало интересно, «А как же воспроизвести аудио, или видео?». Долго рылся на просторах Гугла, откопал там несколько библиотек которые в теории должны были дать мне именно то, что я хочу. Но как показала практика, большинство из этих библиотек читают очень малое количество форматов и не очень удобны в использовании. Еще порывшись пару дней, нашел наконец-то то, что в теории должно было помочь мне с решением задачи. Библиотека VLCj берет кодеки из VLC медиаплеера и с их помощью воспроизводит файлы. Еще день страданий с туториалом на официальном сайте и наконец-то удалось запустить воспроизведение видеофайла в JFrame.

Перейдем собственно к делу:


1. Скачаем саму библиотеку (лучше брать не самую последнюю версию, так как у нее есть проблемы с совместимостью) ссылка

2. Если у вас еще не установлен VLC медиа плеер, то вам придется его скачать и установить. Скачать его можно на официальном сайте VideoLan (лучше брать последнюю версию, она содержит больше кодеков).

3. IDE, я использую Eclipse.

Для начала создадим новый проект и назовем его к примеру, «MediaPlayer».

Теперь откройте папку MediaPlayer в вашем eclipse-workspace, и распакуйте скачанный архив с библиотекой в эту папку.

Далее в Eclipse, в настройках вашего проекта нажмите «Add External JARs» и в открывшемся окне найдите и выберете файл vlcj-3.0.1.jar. Выбираете ЕГО И ТОЛЬКО ЕГО.

Итак, библиотеку к проекту подключили. Далее нам нужно создать экземпляр класса. Создадим к примеру Test.java (надеюсь этот процесс никому объяснять не нужно).

Получили пустой класс с приблизительно таким содержанием:

public class Test {
public static void main(String[] args) {
 }
}

Далее нам нужно создать JFrame в котором мы хотим отобразить наше видео. Так же создадим JPanel и поместим в него Canvas который мы используем в качестве сурфейса для нашего видеоплеера.

public class Test {
public static void main(String[] args) {
   JFrame f=new JFrame();
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.setVisible(true);
   f.setBounds(100,100,1000,600);
   Canvas c=new Canvas();
   c.setBackground(Color.black);
 
   JPanel p=new JPanel();
   p.setLayout(new BorderLayout());
   p.add(c);
   f.add(p);
 }
}

Итак, визуальная часть готова. Далее обратимся непосредственно к библиотеке и VLC плееру. И собственно создадим сам плеера в нашем фрейме.

NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\VideoLAN\VLC");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
MediaPlayerFactory mpf= new MediaPlayerFactory();
EmbeddedMediaPlayer emp= mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(f));
emp.setVideoSurface(mpf.newVideoSurface(c));
emp.setEnableMouseInputHandling(false);
emp.setEnableKeyInputHandling(false);
String file="C:\\Users\Admin\eclipse-workspace\MediaPlayer/video.avi";      
emp.prepareMedia(file);
emp.play();

Здесь мы указали путь к плееру VLC (а точнее к файлам libvlc.dll, libvlccore.dll и папке plugins). Создали расширенный медиаплеер (он обладает большим набором возможностей чем просто «медиаплеер»), присвоили ему сурфейс, указали путь к видеофайлу, подготовили файл к воспроизведению и собственно воспроизвели.

В итоге ваш код будет иметь приблизительно такой вид:

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
 
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
import uk.co.caprica.vlcj.player.embedded.windows.Win32FullScreenStrategy;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
 
public class Test {
public static void main(String[] args) {
   JFrame f=new JFrame();
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   f.setVisible(true);
   f.setBounds(100,100,1000,600);
   Canvas c=new Canvas();
   c.setBackground(Color.black);
 
   JPanel p=new JPanel();
   p.setLayout(new BorderLayout());
   p.add(c);
   f.add(p);
    
   NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files/VideoLAN/VLC");
   Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
   MediaPlayerFactory mpf= new MediaPlayerFactory();
   EmbeddedMediaPlayer emp= mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(f));
   emp.setVideoSurface(mpf.newVideoSurface(c));
   emp.setEnableMouseInputHandling(false);
   emp.setEnableKeyInputHandling(false);
   String file="C:\\Users\Admin\eclipse-workspace\MediaPlayer/video.avi";       
   emp.prepareMedia(file);
   emp.play();
 }
}

Учитывайте что:
— У вас путь к VLC медиа плееру может отличаться.
— Путь к вашему видеофайлу может отличаться.

Для удобства можно скопировать необходимые файлы из VLC медиа плеера в ваш проект. Так же это исключит необходимость устанавливать VLC на компьютерах где должна будет работать ваша программа.

У меня поначалу возникли сложности с воспроизведением файлов, у которых в названии, или в пути есть кириллица. Если у вас возникнут такие же сложности, то кликните правой кнопкой по вашему экземпляру класса и зайдя в его настройки измените его кодировку на UTF-8

Комментарии (3)


  1. vlanko
    24.12.2018 22:10

    Зачем был ГУИ, если плеер вроде покажет в полный экран?


    1. CrazyDeveloperZz Автор
      24.12.2018 22:13

      Плеер покажет в полный экран, если дописать emp.toggleFullScreen();
      Без этой строчки изображение будет отображаться в фрейме


  1. CrazyDeveloperZz Автор
    26.12.2018 02:17

    Вот поступило небольшое, но полезное дополнение:

    Я когда делал то же самое год назад, встретил проблему. Не работало и все тут! А оказалось у меня Java 64 бита, а VLC то 32!
    А у VLC на 64 разряда еле нашел, тогда. Не знаю как сейчас, но в то время у них была только бета и закопанная в самом дальнем уголке сайта.