我在J2ME中重启声音有问题。我想在构造函数中创建播放器,然后调用playExplosion()来播放它,但它只播放一次。我正在使用Wireless Toolkit。
声音等级
public class Sound () {
private Player playerExplosion;
public Sound() throws IOException, MediaException {
// Explosion
InputStream is = getClass().getResourceAsStream("/explosion.mid");
playerExplosion = Manager.createPlayer(is, "audio/midi");
playerExplosion.realize();
playerExplosion.setLoopCount(1);
}
public void playExplosion() {
try {
System.out.println(playerExplosion.getState());
playerExplosion.start();
} catch (MediaException ex) {
ex.printStackTrace();
}
}
}
MyMIDlet类
public class MyMIDlet extends MIDlet() {
public Sound sound;
public MyMIDlet() {
// Init sound object
try {
sound = new Sound(this);
} catch (Exception ex) {
ex.printStackTrace();
}
// Test
System.out.println("Start");
for (int i = 0; i < 5; i++) {
sound.playExplosion();
// My sound is less than 1 second.
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
System.out.println("End");
}
}
输出
Start
200
300
300
300
300
End
第一次,start()之前的playerExplosion状态为200(REALIZED)。
对于2nd,3rd,4th,5th次,start()之前的playerExplosion状态为300(PREFETCH)。
目前,我必须在playExplosion()方法中再次创建playerExplosion,但在真实设备中它太慢了。
答案 0 :(得分:2)
删除后尝试
playerExplosion.setLoopCount(1);
答案 1 :(得分:0)
实现播放器可能是一个资源且耗时的过程,因为创建playerExplosion
会导致再次调用playerExplosion.realize();
,这就是为什么这个过程需要花费很多时间的原因
当您的播放器在PREFETCHED State
时,您需要做的只是致电playerExplosion.start();
,但不再付款,因为它应支付的次数有一般限制
删除
playerExplosion.setLoopCount(1);
您可以多次支付文件
谢谢
:)