2017-04-25 12 views
1

複数のオーディオファイルを連続して再生しようとしています。複数のオーディオファイルを再生するにはMediaPlayer classを使用します。しかし、私はエミュレータや携帯電話でテストするときに音が重なっている理由を理解できません。私のコードの関連部分は以下の通りです:Android:複数のオーディオファイルを連続して再生すると、サウンドオーバーラップが発生する

private MediaPlayer mPlayer1 = new MediaPlayer(); 
    private MediaPlayer mPlayer2 = new MediaPlayer(); 
    private AudioManager audioManager; 


    public void permissionGrantedActions() { 

    Uri uri1=Uri.parse("android.resource://com.android.packageName/" + mFile1); 
    try{mPlayer1.setDataSource(getActivity(), uri1); 
    }catch (IOException e) { 
     e.printStackTrace(); 
    } 

    mPlayer1.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
    mPlayer1.prepareAsync(); 


    mPlayer1.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      AppLog.logString("Start Playing Sound1"); 
      mPlayer1.start(); 
     } 
    }); 

    mPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mPlayer1.stop(); 

      try { 
       mPlayer1.reset(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      mPlayer1.release(); 
      AppLog.logString("Stop Playing Sound1"); 
     } 
    }); 

    mPlayer2.reset(); 

    Uri uri2=Uri.parse("android.resource://com.android.packageName/" + mFile2); 
    try { 
     mPlayer2.setDataSource(getActivity(), uri2); 
    }catch (IOException e) { 
     e.printStackTrace(); 
    } 

    mPlayer2.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
    mPlayer2.prepareAsync(); 

    mPlayer2.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      AppLog.logString("Start Playing Sound2"); 
      mPlayer2.start(); 
     } 
    }); 

    mPlayer2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mPlayer2.stop(); 

      try { 
       mPlayer2.reset(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      mPlayer2.release(); 
      AppLog.logString("Stop Playing Sound2"); 
     } 
    }); 
... 
} 

上記のアプローチを使用して、音が重なっている(各オーディオファイルには、約1秒の長さで、このコードを使用したときにすべての4つのオーディオファイルは、1秒間に再生されます。.. )。なぜこのように行動しているのか?あなたは何をする必要が前回のMediaPlayerのsetOnCompletionListener からそれらを開始することで、ここでmPlayer1.prepareAsync();
見ることができるようasynchron

答えて

0

まあMediaPlayerのです。 このように:

//init here 
mPlayer1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     // TODO Auto-generated method stub 
     mPlayer1.stop(); 

     try { 
      mPlayer1.reset(); 
      mPlayer2.setOnPreparedListener(new 
      MediaPlayer.OnPreparedListener() { 
       public void onPrepared(MediaPlayer mp) { 
        AppLog.logString("Start Playing Sound2"); 
        mPlayer2.start(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mPlayer1.release(); 
     AppLog.logString("Stop Playing Sound1"); 
    } 
}); 
関連する問題