2014-03-25 18 views
0

我試圖使用MediaPlayer實例分別播放多個音頻文件,以響應各種傳感器事件。MediaPlayer給出了不同的結果,如果它必須等待更長的時間之後.start()被調用

我發現在調用MediaPlayer.start()之前加載要播放的片段時,音頻片段將會播放正常。但是,該應用程序的性能受到重大影響。理想情況下,每個音頻剪輯應該在播放最後一個音頻剪輯後立即加載到MediaPlayer中,讓MediaPlayer隨時可以開始播放。

我期望這很簡單,但現在我製作了音頻改變只是不播放。 PlayAudioClip()肯定仍在按預期方式調用,但之後出現了問題。沒有錯誤發生,所以我不認爲MediaPlayer正在改變狀態,但在等待播放的時候可能會干擾它。

這裏是我的代碼的簡化版本:

public class MainActivity extends Activity implements SensorEventListener { 
    private Random numGenerator; 
    private SensorManager manager; 
    private Sensor accelerometer; 
    private MediaPlayer mediaPlayer; 
    private Uri[] audioClips; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     initVariables(); 
     prepareNextAudioClip(); //load first audioClip 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
      if(conditionsRight()){ 
       playAudioClip(); 
      } 
     } 
    } 

    private void playAudioClip() { 
     mediaPlayer.start(); 
     prepareNextAudioClip(); 
    } 

    private void prepareNextAudioClip() { 
     try { 
      mediaPlayer.reset(); 
      Uri audioClip = audioclips[(int) Math.floor(numGenerator.nextDouble()*audioClips.length)]; 
      mediaPlayer.setDataSource(this, audioClip); 
      mediaPlayer.prepare(); 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 


    } 


//Code below here isn't very important... handling setup and teardown 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

    protected void onResume() { 
     super.onResume(); 
     manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); 
     } 

    private void initVariables() { 
     audioClips = new Uri[]{ 
       Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio1), 
       Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio2), 
       Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio3) 
     }; 
     numGenerator = new Random(); 
     mediaPlayer = new MediaPlayer(); 
     manager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     accelerometer = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     if(null == accelerometer) finish(); 
    } 

    protected void onPause() { 
     super.onPause(); 
     manager.unregisterListener(this); 
    } 


    protected void onDestroy(){ 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 

} 

PS:這已經全部假設我將只使用的MediaPlayer的一個實例,但我也喜歡上輸入,如果你認爲使用多個MediaPlayers並委派他們每個人1個音頻剪輯將是明智的。我的直覺是沒有,因爲我的目的,我不得不使用10-20 MediaPlayers,但它是很好的聽到外界的觀點。

回答

0

這是因爲您在開始播放後立即重置播放器。

private void playAudioClip() { 
    mediaPlayer.start(); //starting playback 
    prepareNextAudioClip(); //reset 
} 

如果要播放隊列中的文件,則可以使用一個實例。但是,如果你必須同時播放多個文件,那麼你需要有幾個媒體播放器實例。

0

我認爲你必須看看微妙的點使用媒體播放器類

在你的代碼中使用有關:

initVariables(); 
prepareNextAudioClip(); //load first audioClip 

initVariables()似乎好了,現在讓我們看看prepareNextAudioClip()

... 
mediaPlayer.reset(); 
... 
... 
mediaPlayer.prepare(); 

上面的代碼似乎損壞Mediaplayer狀態機。有關使用新建,準備,重置的詳細信息,請參閱http://developer.android.com/reference/android/media/MediaPlayer.html。最好使用Errorlistener編寫防禦性MediaPlayer代碼

相關問題