Воспроизведение видео отлично работает в Eclipse, но при экспорте java-проекта в виде исполняемого файла JAR он больше не работает.

Я написал код, который воспроизводит видео .mp4 внутри JFrame. Я использую vlcj-3.0.1, и внутри eclipse все работает отлично. Но когда я экспортирую проект Java в виде исполняемого файла JAR и помещаю папку res отдельно в тот же каталог, что и файл JAR, видео больше не воспроизводится. Я, должно быть, делал что-то не так с путем к файлу, но я не знаю, что я делаю неправильно.

Я уже искал в гугле и нашел тему с точно такой же проблемой:

VLCJ - воспроизведение видео из папки res отлично работает в eclipse, но не из исполняемого файла JAR

Я пытался использовать рекомендации из Каприки, но безуспешно.

    // Attributes
Canvas c = new Canvas();
MediaPlayerFactory mpf = new MediaPlayerFactory();
EmbeddedMediaPlayer emp = mpf.newEmbeddedMediaPlayer();
String mrl = new File("res/video/beach.mp4").getAbsolutePath();

// For Seeing the FilePath, so i can place the res folder correctly after 
//creating the runnable jar file
System.out.println(mrl);



// Giving the Libary for VLCJ Plugin
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "lib");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

// Setting up the player, didnt including the jframe here, since its working
emp.setVideoSurface(mpf.newVideoSurface(c));
emp.setEnableMouseInputHandling(false);
emp.setEnableKeyInputHandling(false);
emp.prepareMedia(mrl);
emp.setRepeat(true);
emp.play();

Я ожидал, что JFrame откроется и воспроизведет видео в цикле. JFrame всплывает, но у меня просто черный экран... (я установил черный цвет фона jframe).


person Johann Doe    schedule 05.07.2019    source источник
comment
не полный ответ, поэтому я просто прокомментирую: вы пытаетесь воспроизвести ресурс, который находится внутри вашего файла jar, используя локальное имя файла или URL-адрес файла. Это просто не сработает. Вероятно, вам следует извлечь медиафайл из файла jar во временный каталог (или куда угодно) и воспроизвести его оттуда.   -  person caprica    schedule 06.07.2019


Ответы (1)


Спасибо за ответ. именно в этом была проблема.

как вы уже упоминали, я извлек ресурсы в отдельную папку и позволил запускаемому файлу JAR добраться до «внешнего» носителя. это сработало с помощью решения caprica, упомянутого в другой теме:

String mrl = new File("res/media/video.mp4").getAbsolutePath();

теперь все становится немного по-другому. так как я хотел загрузить ресурсы из мест, где сохранен файл jar (поэтому файл jar динамически адаптируется к своему местоположению и добавленным ресурсам.

я добавил следующие строки:

String jarDir = new File(ClassLoader.getSystemClassLoader().getResource(".").getPath()).getAbsolutePath();
String dir = jarDir;
String path = "res/video/beach.mp4"

mpf = new MediaPlayerFactory();
emp = mpf.newEmbeddedMediaPlayer();
emp.prepareMedia(dir + path);
emp.setRepeat(true);
emp.play();
person Johann Doe    schedule 07.07.2019
comment
Небольшой несвязанный момент, вам не нужно готовить и воспроизводить отдельно, для вашего фрагмента кода выше я бы просто сделал emp.setRepeat(true) один раз после создания медиаплеера, затем emp.playMedia(dir+path) вместо того, чтобы готовиться и играть отдельно. prepare полезен только в том случае, если вы не собираетесь воспроизводить медиаданные немедленно. - person caprica; 07.07.2019