【问题标题】:Playing a WAV File Multiple Times多次播放 WAV 文件
【发布时间】:2012-05-20 22:40:00
【问题描述】:

每次用户按下一个按钮时,我都需要播放相同的短 wav 文件(1 秒)。我有以下代码可以点击大约 30 次,然后设备上的应用程序“强制关闭”。我认为正在发生的事情是正在创建媒体播放器的新实例,然后实例建立(大约 30 次点击)并且应用程序崩溃。所以我然后添加了“发布”实例,希望在单击按钮时播放 wav,然后释放媒体播放器。但是,它不是那样工作的。使用 mp.release() 没有声音播放可能是因为媒体播放器被释放得太快以至于用户听不到声音?

任何人有一个很好的提示可以帮助我让它工作吗?非常感谢大家。

Button button2 = (Button) findViewById(R.id.button10); button2.setOnClickListener(new View.OnClickListener() {

      public void onClick(View v) {
            // Perform action on click
            MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
            mp.start();
            mp.release();

【问题讨论】:

  • 您检查过 logcat 以找到崩溃的确切原因吗?而且,您似乎已经回答了自己的问题:p

标签: android


【解决方案1】:

它很简单,只需创建一次 MediaPlayer,然后随着时间的推移播放它。

 private MediaPlayer mp;
 public void onClick(View v) {
            // Perform action on click
            if (mp == null){
                 mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
            }
            mp.start();
 }

【讨论】:

    【解决方案2】:

    既然 SoundPool 更适合小型音频文件,为什么还要使用 MediaPlayer?作为基础,您可以使用它:

    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    
    
    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 70);
    
    final HashMap<Integer, Integer>  soundPoolMap = new HashMap<Integer, Integer>();
    
    final int soundID = 4;
    soundPoolMap.put(soundID, soundPool.load(this, R.raw.wav_sound, 4));
    
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() 
    {
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) 
        {
            if (sampleId == 4)
            {
                soundPool.play(4, 50, 50, 1, 0, 1f);                                
            }
        }
    });
    

    【讨论】:

      【解决方案3】:

      以下是可行的简单解决方案

      MediaPlayer mp;
      mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
      
       public void onClick(View v) {
                  // Perform action on click
                  if(mp.isPlaying())
                      {
                      mp.stop();
                      mp.reset();
                      mp.release();
                      }
                      mp = MediaPlayer.create(getApplicationContext(), R.raw.clicker);
                      mp.start();
      

      这将检查 mediaplayer 是否已经在播放。如果它已经在播放,它将停止并释放它,然后初始化 mediaplayer(mp) 对象并启动 mediaplayer。

      如果没有播放,它将执行if语句之后的代码,并在初始化媒体播放器对象(本例中为mp)后启动媒体播放器

      要了解有关 MediaPlayer 的更多信息,请研究此http://developer.android.com/reference/android/media/MediaPlayer.html。研究 Mediaplayer 生命周期

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 2012-12-02
        相关资源
        最近更新 更多