Javax : Try to find a solution to open an AVI within jar

标签 java jar embedded-resource jmf

我试图在可执行 jar 文件中打开 AVI,我找到的唯一解决方案是使用 FileOutputStream 并在临时文件中制作副本:

InputStream inputStream = getClass().getResourceAsStream(filePathInJar);
int read = 0;
byte[] bytes = new byte[1024];
this.file = new File("c:\\tmpfile.avi");
OutputStream out = new FileOutputStream(file);
while ((read = inputStream.read(bytes)) != -1) {
    out.write(bytes, 0, read);
}
inputStream.close();
out.flush();
out.close();

然后我可以:

mediaPlayer = Manager.createRealizedPlayer(new File("c:\\tmpfile.avi").toURI().toURL());

第一个问题:你有更好的解决方案吗?

所以对于这个解决方案,我会在他使用结束时删除临时文件,我试过了:

mediaPlayer.stop();
mediaPlayer.close();
mediaPlayer.deallocate();
file.delete()

但是删除不起作用。似乎一直在播放器中使用...

第二个问题:如何停止使用临时文件或强制删除?

谢谢。

最佳答案

我没试过这个,但你可以尝试使用 getClass().getResource(filePathInJar) 来获取资源的 URL,然后用它来构造一个 MediaLocator 用作 createRealizedPlayer() 的参数。像这样的东西:

URL url = getClass().getResource(filePathInJar);
MediaLocator locator = new MediaLocator(url);
mediaPlayer = Manager.createRealizedPlayer(locator);

编辑: 因此,我已经验证 MediaLocator 无法处理 jar:file:/url。 在我看来,您有两个选择:

  1. 查找或创建基于 InputStream 的自定义数据源。页面位于 http://www.extollit.com/isdsjmf.php声称有一个有效的。我没试过。

  2. 继续做您现在正在做的事情 - 将媒体文件从 jar 复制到临时文件,并使用 file://url。 我认为您可以通过使用 File.createTempFile() 和 File.deleteOnExit() 来解决删除文件的问题

关于Javax : Try to find a solution to open an AVI within jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451430/

相关文章:

java - 如何从复合 JAR 加载资源?

Java:仅编译另一个类中选定的方法

c# - 如何读取 Build-Action : Resource items

java - 项目显示已添加 key 但未显示在库存中

java - 从输入中转义 unicode

jar - Clojure:如何使用 lein-uberjar 包含资源

audio - 官方认可的从 Qt5.x 下的资源播放音频的方式

java - Android读入与app打包的.txt文件

java - 连接被拒绝:无法连接到ResourceManager:8032

java - Jboss 4.2.3 迁移到 Jboss 7 EAP、数据源和安全