2014-03-25 22 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代码

相关问题