在Eclipse中播放视频可以很好地工作,但是当将java项目导出为可运行的JAR文件时,它就不再工作了

在Eclipse中播放视频可以很好地工作,但是当将java项目导出为可运行的JAR文件时,它就不再工作了,java,eclipse,vlcj,Java,Eclipse,Vlcj,我写了一些代码,在JFrame中播放一些.mp4视频。我使用的是vlcj-3.0.1,eclipse内部的所有功能都非常完美。 但是,当我将Java项目导出为可运行的JAR文件,并将res文件夹与JAR文件分别放在同一目录中时,视频就不再播放了。我一定是在文件路径上做错了什么,但我不知道我做错了什么 我已经在谷歌上找到了一个问题完全相同的线程: 我尝试使用卡布里卡的推荐,但没有成功 // Attributes Canvas c = new Canvas(); MediaPlayerFa

我写了一些代码,在JFrame中播放一些.mp4视频。我使用的是vlcj-3.0.1,eclipse内部的所有功能都非常完美。 但是,当我将Java项目导出为可运行的JAR文件,并将res文件夹与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背景颜色设置为黑色)。

谢谢您的回复。这正是问题所在

正如您已经提到的,我将资源提取到一个单独的文件夹中,并让可运行的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();

这不是一个完整的答案,所以我只想评论一下:您正在尝试使用本地文件名或文件URL播放jar文件中的资源。这根本不起作用。您可能应该将媒体从jar文件提取到一个临时目录(或任何您想要的地方)一个不相关的小问题,你不需要单独做准备和播放,对于上面的代码片段,我只需要在创建媒体播放器之后做一次emp.setRepeat(true),然后再做emp.playMedia(dir+path)而不是将“准备”和“播放”分开。仅当您不打算立即播放媒体时,“准备”才有用。