使用 getClass().getResource() 时 VLCJ 不播放视频
VLCJ doesn't play video when using getClass().getResource()
我正在制作游戏,但它依赖于视频;我之前没有处理过视频,所以我使用了 VLCJ,因为它是 YouTube 上出现的第一件事。无论如何,问题是当我使用 getClass().getResource()
并执行 jar 时,它不会加载媒体。所以我需要的是可以从罐子中打开媒体。
String path1 = getClass().getResource("/media/introVideo.mp4").getFile(); //Not works (I want this to work)
String path2 = getClass().getResource("/media/introVideo.mp4").toExternalForm()); //Not works (I want this to work)
String path3 = getClass().getResource("/media/introVideo.mp4").toString()); //Not works (I want this to work)
String path4 = getClass().getResource("/media/introVideo.mp4").getFile().replace("/", "\"); //Works (Not what I need)
String path5 = new File("src\media\introVideo.mp4").toString(); //Works (Not what I need)
我在使用 path1、path2 和 path3 时得到的错误如下:
libdvdnav: Using dvdnav version 6.0.0
libdvdread: Could not open D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 with libdvdcss.
libdvdread: Can't open D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 for reading
libdvdnav: vm: failed to open/read the DVD
[000000001c5ed6a0] filesystem stream error: cannot open file D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 (Invalid argument)
[000000001c5e3d00] main input error: Your input can't be opened
[000000001c5e3d00] main input error: VLC is unable to open the MRL 'file:///D:/Programming/HyperDance/%2FD%3A%2FProgramming%2FHyperDance%2Fbuild%2Fclasses%2Fmedia%2FintroVideo.mp4'. Check the log for detail
片段:
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.awt.Canvas;
import java.awt.Color;
import javax.swing.JFrame;
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 extends JFrame {
static Test frame;
static Canvas canvas;
public Test() {
canvas = new Canvas();
canvas.setBackground(Color.BLACK);
add(canvas);
}
public static void main(String[] args) {
frame = new Test();
frame.setSize(1047,615);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
//↓ How do I fix the importing of the media ↓
emp.prepareMedia(new Object().getClass().getResource("/media/introVideo.mp4").getFile());
//↑ The parameter only accepts Strings ↑
emp.play();
}
}
总结:
我需要播放 jar 中的视频。
视频在我不使用时播放 getClass().getResource()
,但我需要使用它来访问 jar 中的媒体。
问题:如何使用 VLCJ 从 jar 播放视频?
嗯,我已经找到解决办法了:
首先,我将 jar 放入文件夹 Surprise
以及另一个包含视频的文件夹。
然后,我让程序搜索 jar 中的文本文件 guide.txt
以了解我的 Surprise
文件夹的位置。
最后我把guide.txt
路径换成了视频的路径:
C:/Users/Steve/Desktop/Surprise/ HyperDance-BTS.jar! /media/guide.txt
-> C:/Users/Steve/Desktop/Surprise/视频/introVideo.mp4
文件夹:
- 惊喜(C:, D:, 任何盘:)
- HyperDance-AC/DC.jar
- Guide.txt
- 媒体(图像和声音)
- 视频(隐藏文件夹)
- introVideo.mp4
片段:
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.awt.Canvas;
import java.awt.Color;
import javax.swing.JFrame;
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 extends JFrame {
static Test frame;
static Canvas canvas;
static int video = 1;
public Test() {
canvas = new Canvas();
canvas.setBackground(Color.BLACK);
add(canvas);
}
public static void main(String[] args) {
frame = new Test();
frame.setSize(1047,615);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
if (video==1) {
emp.prepareMedia(url("introVideo.mp4"));
emp.play();
}
if (video==2) {
//Another video
}
}
static String url (String video) {
String mrl = new Object().getClass().getResource("/media/guide.txt").getFile();
String url = mrl.replace("/", "\").split("\\",2)[1].split("Surprise")[0].concat("Surprise\videos\"+video);
return url;
}
}
有没有更好的方法或更官方的方法来做到这一点?
我正在制作游戏,但它依赖于视频;我之前没有处理过视频,所以我使用了 VLCJ,因为它是 YouTube 上出现的第一件事。无论如何,问题是当我使用 getClass().getResource()
并执行 jar 时,它不会加载媒体。所以我需要的是可以从罐子中打开媒体。
String path1 = getClass().getResource("/media/introVideo.mp4").getFile(); //Not works (I want this to work)
String path2 = getClass().getResource("/media/introVideo.mp4").toExternalForm()); //Not works (I want this to work)
String path3 = getClass().getResource("/media/introVideo.mp4").toString()); //Not works (I want this to work)
String path4 = getClass().getResource("/media/introVideo.mp4").getFile().replace("/", "\"); //Works (Not what I need)
String path5 = new File("src\media\introVideo.mp4").toString(); //Works (Not what I need)
我在使用 path1、path2 和 path3 时得到的错误如下:
libdvdnav: Using dvdnav version 6.0.0
libdvdread: Could not open D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 with libdvdcss.
libdvdread: Can't open D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 for reading
libdvdnav: vm: failed to open/read the DVD
[000000001c5ed6a0] filesystem stream error: cannot open file D:\Programming\HyperDance\D:\Programming\HyperDance\build\classes\media\introVideo.mp4 (Invalid argument)
[000000001c5e3d00] main input error: Your input can't be opened
[000000001c5e3d00] main input error: VLC is unable to open the MRL 'file:///D:/Programming/HyperDance/%2FD%3A%2FProgramming%2FHyperDance%2Fbuild%2Fclasses%2Fmedia%2FintroVideo.mp4'. Check the log for detail
片段:
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.awt.Canvas;
import java.awt.Color;
import javax.swing.JFrame;
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 extends JFrame {
static Test frame;
static Canvas canvas;
public Test() {
canvas = new Canvas();
canvas.setBackground(Color.BLACK);
add(canvas);
}
public static void main(String[] args) {
frame = new Test();
frame.setSize(1047,615);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
//↓ How do I fix the importing of the media ↓
emp.prepareMedia(new Object().getClass().getResource("/media/introVideo.mp4").getFile());
//↑ The parameter only accepts Strings ↑
emp.play();
}
}
总结:
我需要播放 jar 中的视频。
视频在我不使用时播放
getClass().getResource()
,但我需要使用它来访问 jar 中的媒体。问题:如何使用 VLCJ 从 jar 播放视频?
嗯,我已经找到解决办法了:
首先,我将 jar 放入文件夹
Surprise
以及另一个包含视频的文件夹。然后,我让程序搜索 jar 中的文本文件
guide.txt
以了解我的Surprise
文件夹的位置。最后我把
guide.txt
路径换成了视频的路径:C:/Users/Steve/Desktop/Surprise/ HyperDance-BTS.jar! /media/guide.txt
-> C:/Users/Steve/Desktop/Surprise/视频/introVideo.mp4
文件夹:
- 惊喜(C:, D:, 任何盘:)
- HyperDance-AC/DC.jar
- Guide.txt
- 媒体(图像和声音)
- 视频(隐藏文件夹)
- introVideo.mp4
- HyperDance-AC/DC.jar
片段:
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import java.awt.Canvas;
import java.awt.Color;
import javax.swing.JFrame;
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 extends JFrame {
static Test frame;
static Canvas canvas;
static int video = 1;
public Test() {
canvas = new Canvas();
canvas.setBackground(Color.BLACK);
add(canvas);
}
public static void main(String[] args) {
frame = new Test();
frame.setSize(1047,615);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
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(frame));
emp.setVideoSurface(mpf.newVideoSurface(canvas));
if (video==1) {
emp.prepareMedia(url("introVideo.mp4"));
emp.play();
}
if (video==2) {
//Another video
}
}
static String url (String video) {
String mrl = new Object().getClass().getResource("/media/guide.txt").getFile();
String url = mrl.replace("/", "\").split("\\",2)[1].split("Surprise")[0].concat("Surprise\videos\"+video);
return url;
}
}
有没有更好的方法或更官方的方法来做到这一点?