如何从JMF中的类路径加载媒体资源
我有一个 Java 应用程序,我想将其转换为可执行 jar。我在这个应用程序中使用 JMF,但我似乎无法让声音文件正常工作...
我使用创建 jar
jar cvfm jarname.jar manifest.txt *.class *.gif *.wav
,因此,所有声音文件都放入 jar 中,在代码中,我正在创建使用该 jar 的玩家
Player player = Manager.createPlayer(ClassName.class.getResource("song1.wav"));
位于我的桌面上,当我尝试运行它时,会发生此异常:
javax.media.NoPlayerException: Cannot find a Player for :jar:file:/C:/Users/Pojo/
Desktop/jarname.jar!/song1.wav
...它没有收到 IOExceptions,因此它似乎至少找到了文件本身。
另外,在我使用 getResource 之前,我曾经这样使用它:
Player player = Manager.createPlayer(new File("song1.wav").toURL());
并且播放得很好,所以我知道声音文件本身没有任何问题。
我尝试切换到此方法而不是 File 方法的原因是,声音文件可以打包在 jar 本身内,而不必是目录中的同级文件。
I have a Java application that I want to turn into an executable jar. I am using JMF in this application, and I can't seem to get the sound files working right...
I create the jar using
jar cvfm jarname.jar manifest.txt *.class *.gif *.wav
So, all the sound files get put inside the jar, and in the code, I am creating the Players using
Player player = Manager.createPlayer(ClassName.class.getResource("song1.wav"));
The jar is on my desktop, and when I attempt to run it, this exception occurs:
javax.media.NoPlayerException: Cannot find a Player for :jar:file:/C:/Users/Pojo/
Desktop/jarname.jar!/song1.wav
...It's not getting IOExceptions, so it seems to at least be finding the file itself all right.
Also, before I used the getResource, I used to have it like this:
Player player = Manager.createPlayer(new File("song1.wav").toURL());
and it was playing fine, so I know nothing is wrong with the sound file itself.
The reason I am trying to switch to this method instead of the File method is so that the sound files can be packaged inside the jar itself and not have to be its siblings in a directory.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这与生产代码相去甚远,但这似乎解决了任何运行时异常(尽管它实际上尚未连接到播放任何内容):
This is a far cry from production code, but this seems resolved any runtime exceptions (though it's not actually wired up to play anything yet):
新的解决方案:
首先,需要一个自定义的
DataSource
类,该类返回实现Seekable
的SourceStream
:然后,使用上面的自定义数据源创建一个播放器,并添加一个
ControllerListener
以使播放器循环:请注意,如果没有自定义数据源,JMF 会反复尝试返回到开头 - 但会失败,并最终放弃。这可以从调试相同的
ControllerListener
中看出,每次尝试都会收到多个事件。或者,使用 MediaPlayer 方法进行循环(您在我之前的回答中提到过):
同样,我不会考虑这个可用于生产的代码(可以使用更多的 Javadocs 和日志记录等),但是它已经过测试并且可以工作(Java 1.6),并且应该很好地满足您的需求。
圣诞快乐,节日快乐!
New solution:
First, a custom
DataSource
class that returns aSourceStream
that implementsSeekable
is needed:Then, the above custom data source is used to create a player, and a
ControllerListener
is added to cause the player to loop:Note that without the custom data source, JMF tries repeatedly to seek back to the beginning - but fails, and eventually gives up. This can be seen from debugging the same
ControllerListener
, which will receive a several events for each attempt.Or, using the
MediaPlayer
approach to loop (that you mentioned on my previous answer):Again, I would not consider this production-ready code (could use some more Javadocs and logging, etc.), but it is tested and working (Java 1.6), and should meet your needs nicely.
Merry Christmas, and happy holidays!
如果
song1.wav
位于应用程序运行时类路径上的 Jar 的根目录中,则该方法有效。That will work if the
song1.wav
is in the root of a Jar that is on the run-time class-path of the application.