【发布时间】:2012-08-28 10:31:18
【问题描述】:
下面的 play 方法来自一个类,该类在实例化时将 .wav 文件读入名为 data 的字节数组中,并将声音格式存储在名为 format 的 AudioFormat 对象中。
我有一个程序从java.util.Timer 调用play。当我进入包含所有相关 .class 文件的文件夹并使用命令 java MainClass 运行程序时,一切都按预期工作。但是,当我将所有 .class 文件放入可执行 .jar 并使用命令 java -jar MyProgram.jar 运行程序时,使用 play 方法播放的声音会在 50 到 150 毫秒后被切断。
public void play() throws LineUnavailableException {
final Clip clip = (Clip)AudioSystem.getLine(new DataLine.Info(Clip.class, format));
clip.open(format, data, 0, data.length);
new Thread() {
public void run() {
clip.start();
try {
Thread.sleep(300); // all sounds are less than 300 ms long
} catch (InterruptedException ex) { /* i know, i know... */ }
clip.close();
}
}.start();
}
几个cmets:
我已尝试将
play方法中的睡眠时间增加到 1000 毫秒,但行为没有任何变化。使用
System.nanoTime为Thread.sleep计时,可确认线程睡眠的时间与预期的时间一样长。由于要播放的声音文件是预加载到内存中的,我认为从 .jar 中提取声音资源的行为不会导致问题。
我尝试使用内存池大小选项
-Xms2m和-Xmx64m(分别)从 jar 的内部和外部运行程序,但行为没有变化。
我在 Ubuntu 11.04 上运行 OpenJDK Java 6。知道发生了什么吗?
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖 SSCCE。这可能是
byte[]的加载问题。 -
@AndrewThompson:你完全正确!将 .wav 文件读入字节数组的方法中存在错误。当我使用 java MainClass 运行程序时,输入流能够在单个读取调用中读取 .wav 文件,因此该错误并不明显。当我从 .jar 运行程序时,需要多次读取调用,并且出现了错误。非常感谢你的帮助!如果您发表评论作为答案,我很乐意接受。
-
@AndrewThompson:谢谢!很抱歉,我花了这么长时间才接受您的回答......
标签: java multithreading javasound