Android soundpool 循环逻辑

Posted

技术标签:

【中文标题】Android soundpool 循环逻辑【英文标题】:Android soundpool loop logic 【发布时间】:2015-10-21 05:23:56 【问题描述】:

我有两个按钮可以循环播放相同优先级的音池文件。因此,如果 1 个按钮正在循环播放,而另一个按钮被按下,则此按钮停止,而另一个按钮开始播放。 到这里为止还好。 现在假设我有每个 2 秒的声音文件,在按下 btn 2 后,btn 1 应该完成文件 1 的声音,即如果刚刚开始和停止,它应该播放 2 秒。如何做到这一点?

目前如果我播放btn2,btn 1会在文件未完成播放的那一刻停止播放并启动文件2。我希望在停止之前完全播放文件1。

请帮忙!

【问题讨论】:

【参考方案1】:

我不认为你可以用声音池来实现,因为声音池没有 OnComletionListener 或 isPlaying 方法。

实现这一点的唯一方法是创建一个新线程来侦听队列大小并在媒体播放器不播放时使用新 ID 启动媒体播放器。参考下面的代码

private Queue<Integer> qSoundID;
private MediaPlayer mp;

private void init()
    yourButton.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
            qSoundID.add(R.raw.yoursoundid);
        
    );

    qSoundID = new LinkedList<Integer>();

    new Thread(new Runnable() 
        @Override
        public void run() 
            while (true) 
                try 
                    Thread.sleep(100);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                if (qSoundID.size() > 0) 
                    if(mp==null||!mp.isPlaying())
                        mp = MediaPlayer.create(MainActivity.this, qSoundID.poll());
                        mp.start();
                    

                
            
        
    ).start();

或者在 MediaPlayer 上设置 OnCompletionListener 将播放下一个声音 id。参考下面的代码

private Queue<Integer> qSoundID;
private MediaPlayer mp;

private void init() 
    yourButton.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
            int soundID = R.raw.yoursoundid;
            playSound(soundID);
        
    );
    qSoundID = new LinkedList<Integer>();


private void playSound(int soundID) 
    if (mp == null || !mp.isPlaying()) 
        mp = MediaPlayer.create(MainActivity.this, soundID);
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
            @Override
            public void onCompletion(MediaPlayer mp) 
                playSound(qSoundID.poll());
            
        );
        mp.start();
    
    else
        qSoundID.add(soundID);
    

【讨论】:

好吧,这无济于事,因为我使用声音池的循环属性是有原因的。我有许多平均为 2 秒的声音,我希望仅在当前声音在循环中完成播放(完成其 2 秒)时才优先播放下一个声音。还是谢谢! 在使用媒体播放器时,也可以调用MediaPlayer.setLooping(true); 然后你可以编写你的逻辑在 OnCompletionListener 上播放下一个声音,希望这会有所帮助

以上是关于Android soundpool 循环逻辑的主要内容,如果未能解决你的问题,请参考以下文章

Android,Soundpool 类 - 循环声音时出现自动暂停问题

带有 soundpool 的循环轨道

Android SoundPool:AudioFlinger 错误

Android:如何混合 2 个音频文件并使用 soundPool 重现它们

android : 使用 SoundPool 播放具有短演变周期的短声音

使用 SoundPool 生成 10 到 20000Hz 之间的正弦波