前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MediaPlayer--stop()流程

MediaPlayer--stop()流程

作者头像
小蚂蚁与大象
发布2020-06-19 16:51:37
1.5K0
发布2020-06-19 16:51:37
举报
文章被收录于专栏:构建FFmpeg Android播放器

frameworks/base/media/java/android/media/MediaPlayer.java

代码语言:javascript
复制
    /**
     * Stops playback after playback has been started or paused.
     *
     * @throws IllegalStateException if the internal player engine has not been
     * initialized.
     */
    public void stop() throws IllegalStateException {
        stayAwake(false);
        _stop();
        baseStop();
    }
  • stayAwake(false) 取消保持屏幕长亮
  • _stop() 调用了native层的接口
  • baseStop() 调用父类 PlayerBase 的接口,这部分主要针对audio, 后面有时间再结合audio模块来分析

下面主要分析一般的流程_stop() frameworks/base/media/jni/android_media_MediaPlayer.cpp

代码语言:javascript
复制
static void
android_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
{
    ALOGV("stop");
    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
    if (mp == NULL ) {
        jniThrowException(env, "java/lang/IllegalStateException", NULL);
        return;
    }
    process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
}

没有其他逻辑,直接调下一层 frameworks/av/media/libmedia/mediaplayer.cpp

代码语言:javascript
复制
status_t MediaPlayer::stop()
{
    ALOGV("stop");
    Mutex::Autolock _l(mLock);
   //已经是stop状态,则直接返回
    if (mCurrentState & MEDIA_PLAYER_STOPPED) return NO_ERROR;
    //判断播放器状态是否符合条件
    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
                    MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE ) ) ) {
        //调用下一次接口
        status_t ret = mPlayer->stop();
        if (ret != NO_ERROR) {
            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
        } else {
            mCurrentState = MEDIA_PLAYER_STOPPED;
        }
        return ret;
    }
    ALOGE("stop called in state %d, mPlayer(%p)", mCurrentState, mPlayer.get());
    return INVALID_OPERATION;
}

先判断player的状态, 处于以下状态才会调用下一层播放器接口 MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED | MEDIA_PLAYER_PLAYBACK_COMPLETE.

mPlayer是mediaplayer 同服务端MediaPlayerService frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp

代码语言:javascript
复制
status_t MediaPlayerService::Client::stop()
{
    ALOGV("[%d] stop", mConnId);
    mMaybeVideoAlive = false;
    sp<MediaPlayerBase> p = getPlayer();
    if (p == 0) return UNKNOWN_ERROR;
    return p->stop();
}

这里直接调用了底层的即可, 如果是原生android 8, 就是调用了Nuplayer 的接口

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档