2

检查MediaPlayer链接)的源代码,该start()方法如下所示:

public  void start() throws IllegalStateException {
        stayAwake(true);
        _start();
}

_start()方法如下所示:

private native void _start() throws IllegalStateException;

检查本机_start()方法(链接)(调用start()但不应该_start()因为本机调用而被调用_start()?):

status_t MediaPlayer::start()
{
    ALOGV("start");
    Mutex::Autolock _l(mLock);
    if (mCurrentState & MEDIA_PLAYER_STARTED)
        return NO_ERROR;
    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |
                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {
        mPlayer->setLooping(mLoop);
        mPlayer->setVolume(mLeftVolume, mRightVolume);
        mPlayer->setAuxEffectSendLevel(mSendLevel);
        mCurrentState = MEDIA_PLAYER_STARTED;
        status_t ret = mPlayer->start();
        if (ret != NO_ERROR) {
            mCurrentState = MEDIA_PLAYER_STATE_ERROR;
        } else {
            if (mCurrentState == MEDIA_PLAYER_PLAYBACK_COMPLETE) {
                ALOGV("playback completed immediately following start()");
            }
        }
        return ret;
    }
    ALOGE("start called in state %d", mCurrentState);
    return INVALID_OPERATION;
}

数据在哪里读取?我想检查 Android 如何与 RTSP 一起工作,但我找不到它加载数据的位置。我想知道它是否使用诸如 FFMpeg 之类的库或其他一些实现。

编辑:

为什么使用 JNI 需要这段代码?

4

3 回答 3

3

以下所有路径均引用 src/frameworks/base/。

在 media/jni/android_media_MediaPlayer.cpp 中,您将找到将 Java 方法调用转发到底层原生框架的 JNI 代码。您可以看到gMethods[]数组中的名称映射和AndroidRuntime::registerNativeMethods文件底部附近的调用。您可以在此处阅读有关使用 JNI 注册本机方法的更多信息,但这并不是真正有趣的部分。

在这个阶段,我们处于 Java 的本机对应部分MediaPlayer。在大多数情况下,它也没有做任何有趣的事情。它绑定到MediaPlayerService直通IBinder交易。基于媒体类型MediaPlayerService创建实际MediaPlayerService::Client的本地播放MediaPlayer器,并维护一个客户端(您可以在以下文件中看到所有这些情况(如果您有兴趣):

媒体/libmedia/mediaplayer.cpp、媒体/libmedia/IMediaPlayer.cpp、媒体/libmedia/IMediaPlayerClient.cpp、媒体/libmedia/IMediaPlayerService.cpp、媒体/libmediaplayerservice/MediaPlayerService.cpp

libmedia 的头文件位于 include/media/libmedia/ 中。

现在到真正有趣的部分,即组件播放器。在 MediaServicePlayer.cpp 中有几个getPlayerType方法可以决定要实例化哪个播放器。有 Stagefright 框架(AwesomePlayer 和 NuPlayer)和用于 MIDI 的 Sonivox 播放器。对于 RTSP,您将获得 NuPlayer。您可以在 media/libmediaplayerservice/nuplayer/ 中找到粘合层,在 media/libstagefright/ 和 media/libstagefright/rtsp/ 中找到所有真实源代码。

于 2013-10-22T02:14:54.593 回答
1

你在路上错过了一步。private native void _start()Java代码中的 指的是MediaPlayer JNI层中的这个入口(指的是这个函数)。

至于 RTSP 实现,您可能会在Stagefright 源代码中找到它。

于 2013-10-21T09:51:49.720 回答
0

_start 方法在此 mediaplayer 文件链接中的 jni 中定义

从这里开始调用 libmedia start 方法。

于 2013-10-21T09:51:33.137 回答