mediaplayer 可以同时创建多个对象,实现多个播放任务。在Android4.1中,MediaPlayer实现两个完全独立的MediaPlayer类上执行无缝播放,主要是增加了一个实现无缝播放的函数,即:setNextMediaPlayer。
这里介绍一下Android是如何实现无缝播放的。
从framework上的mediaplayer.java开始,对应在jni,native,etc中添加对应处理:
在第一个MediaPlayer类执行结束前的任何时间调用setNextMediaPlayer(const sp<MediaPlayer>& next)这个方法,该方法的参数是第二个文件创建的MediaPlayer实例。然后Android系统将会在您第一个停止的时候紧接着播放第二个文件。
setnextmediaplayer的调用关系:
MediaPlayer类中的setNextMediaPlayer方法一路追踪JNI层的Android_Media_MediaPlayer.cpp,再到MediaPlayer.cpp,通过IMediaPlayer.cpp中的BnMediaPlayer到MediaPlayerService中的Client::setNextPlayer函数。
MediaoPlayerService.cpp:
status_t MediaPlayerService::Client::setNextPlayer(const sp<IMediaPlayer>& player) {
ALOGV("setNextPlayer");
Mutex::Autolock l(mLock);
sp<Client> c = static_cast<Client*>(player.get());
mNextClient = c;
if (mAudioOutput != NULL && c != NULL) {
mAudioOutput->setNextOutput(c->mAudioOutput);
} else {
ALOGE("no current audio output");
}
return OK;
}
从MediaPlayerServie中的client获得另外一个track的AndroidOutput:
void MediaPlayerService::AudioOutput::setNextOutput(const sp<AudioOutput>& nextOutput) { mNextOutput = nextOutput; }
无缝播放是android4.1添加的新的特性,支持音频流在一起播放而不产生停顿。完成的主要任务是上层App要实现不同音频文件的无缝播放。