我的媒体播放器在闲置一段时间后会延迟启动,也有一段时间不播放音频。
早些时候我使用过setDataSource()
,但这次我使用的是create()
。
作为参考,这是我正在使用的代码:
AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed));
mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mp.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
mp.release();
}
});
mp.prepareAsync();
我也有start()的延迟问题。我用onPrepared中的mp.seekTo(0)修复它,如下所示:
mp.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mp.seekTo(0);
mp.start();
}
});
我使用FileInputStream。您没有设置AudioStreamType。以下是我设置MediaPlayer的方法。
public void setupMediaPlayer(){
mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
fis = new FileInputStream(tempFilePath);
mp.setDataSource(fis.getFD());
mp.prepare();
mp.setOnPreparedListener(this);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
tempFilePath是文件的路径。
我还在这个类中实现了setOnPreparedListener,这使我的代码在我看来更具可读性。
也很好的链接参考:MediaPlayer State Diagram
我没有足够的声望点评论mdiener的答案,但seekTo(0)方法有效,这是我职业生涯中见过的最奇怪的错误之一。
作为测试,我计算了Android和iOS上文件的播放时间(本地文件,只播放方法定时)。 Android播放文件总是花费大约100毫秒。我添加了seekTo(0)代码,现在它们在大约20ms内一致。
我只能想象prepare()实际上并没有准备好所有必要的东西,需要一些时间的东西会被卸载,直到文件即将播放。
我想如果你愿意改变
mp.prepareAsync();
至
mp.prepare();
并把
mp.start();
在mp.prepare()之后;你的代码会起作用。试试看。