【发布时间】:2015-07-05 08:43:28
【问题描述】:
我使用的音频文件在这里:http://www.orangefreesounds.com/loud-alarm-clock-sound/
这是我在 Eclipse IDE 中的文件结构:
当我在 IDE 中运行音频文件时,它播放得非常好,但当我将它导出为 JAR 文件时就不行了。我已经检查并发现音频文件在 JAR 文件中。
我正在使用终端命令java -jar Sandbox.jar & 来运行JAR 文件。该程序似乎能够找到该文件(因为它没有抛出 IOException),但似乎无法执行播放。
为什么会出现这个问题,我该如何解决?
奇怪的更新
好的,实际上,JAR 文件在 Windows 8.1 上的 cmd 或 PowerShell 中运行时能够播放音频文件,但由于某种原因不能在 Ubuntu 14.04 的终端中播放。一直以来,我一直在尝试在 Ubuntu 14.04 中运行 JAR 文件。
奇怪的更新 #2
我已确认 JAR 文件仅适用于 Windows 8.1 系统的问题。这个问题中的两个代码 sn-ps 都不起作用,而 MadProgrammer 的两个解决方案都有效。
最小、完整和可验证的示例(不适用于 Windows 或 Ubuntu)
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.*;
public class Sandbox
{
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
AudioFormat af = ais.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, af);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
}
}
尝试的解决方案 #1(不适用于 Windows 或 Ubuntu)
一个尝试的解决方案(如 Andrew Thompson 所建议的)是写 this.getClass().getResource( ... ) 而不是 Sandbox.class.getResource( ... ):
import java.io.IOException;
import java.net.URL;
import javax.sound.sampled.*;
public class Sandbox
{
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
new Sandbox();
}
public Sandbox() throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
URL url = this.getClass().getResource("/sound-effects/alarmSoundClip.wav");
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
AudioFormat af = ais.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, af);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
}
}
【问题讨论】:
-
使用某种 zip 程序并解压 jar 并确保“音效”确实存在于您期望的 jar 文件中
-
音效文件在JAR文件里面;
/sound-effects/alarmSoundClip.wav. -
URL url = Sandbox.class.getResource("/sound-effects/alarmSoundClip.wav");可能得到了错误的类加载器。重新排列代码,使其可以表示为URL url = this.getCass().getResource("/sound-effects/alarmSoundClip.wav");。一种方法是将语句移动到Sandbox构造函数中。 -
@AndrewThompson 作为 JAR 运行时它仍然不起作用。我将编辑我的答案以包含您的解决方案。
-
在
clip.start之后添加clip.drain()。clip.start不是阻塞方法,所以它会启动另一个线程,这可能会允许 JVM 在存在main方法后立即终止
标签: java eclipse swing audio embedded-resource