无法在 J2ME 中重放声音

Posted

技术标签:

【中文标题】无法在 J2ME 中重放声音【英文标题】:Cannot replay sound in J2ME 【发布时间】:2012-04-07 10:00:54 【问题描述】:

我在 J2ME 中有问题重启声音。我想在构造函数中创建播放器,然后调用 playExplosion() 播放它,但它只播放一次。我正在使用无线工具包。

声音类

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)。

对于第 2、3、4、5 次,start() 之前的 playerExplosion 状态为 300(PRE​​FETCH)。

目前,我必须在 playExplosion() 方法中再次创建 playerExplosion,但在真实设备中太慢了。

【问题讨论】:

【参考方案1】:

删除后试试

playerExplosion.setLoopCount(1);

【讨论】:

【参考方案2】:

意识到一个播放器可能是一个资源和耗时的过程,必须创建playerExplosion 将意味着再次调用playerExplosion.realize();,这就是该过程需要这么多时间的原因

当您的玩家在PREFETCHED State 时,您只需致电playerExplosion.start();,但它不会再次付款,因为它应该支付的次数有一般限制

删除

  playerExplosion.setLoopCount(1); 

而且您可以多次支付文件费用

谢谢

:)

【讨论】:

以上是关于无法在 J2ME 中重放声音的主要内容,如果未能解决你的问题,请参考以下文章

在 J2ME 中未播放通知声音

在 Android 中重定向音频/创建备用声音路径

是否可以播放来自蓝牙的流式声音?

停止并快速重放 AudioQueue

在 keydown() 上立即重放音频

在 Apache Pulsar 中重放/重置消息