android 4.1 add无缝播放处理

    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;
}

 

设置好了mNextOutput后,AudioOutput 定义switchToNextOutput,这个函数完成当前文件播放完成立即转化播放下个文件任务。
 
MediaPlayerService::client ::notify函数会调用这个函数的调用AudioOutput : switchToNextOutput:
  
     当前播放的client发出MEDIA_PLAYBACK_COMPLETE消息时,调用switchToNextOutput函数,从而实现了两个独立的MediaPlayer的无缝播放。

 

      无缝播放是android4.1添加的新的特性,支持音频流在一起播放而不产生停顿。完成的主要任务是上层App要实现不同音频文件的无缝播放。   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值