检查源代码中的MediaPlayerlink),方法如下所示:

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

方法如下:
private native void _start() throws IllegalStateException;

检查本机start()方法(link)(调用_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需要这些代码?

最佳答案

以下所有路径都引用src/frameworks/base/。
在media/jni/android_media_mediaplayer.cpp中,可以找到将java方法调用转发到底层本机框架的jni代码。您可以在gMethods[]数组和文件底部附近的AndroidRuntime::registerNativeMethods调用中看到名称映射。您可以阅读更多关于使用jnihere注册本机方法的内容,但这并不是真正有趣的部分。
在这个阶段,我们处于javaMediaPlayer的本机对应位置。在很大程度上,它也没有做任何有趣的事情。它通过MediaPlayerService事务绑定到IBinderMediaPlayerService根据媒体类型创建实际的本机播放机,并维护一个客户端(MediaPlayerService::Client)以便于与本机MediaPlayer进行通信,而本机getPlayerType又将事情冒泡回java。您可以在以下文件中看到所有这些(如果您感兴趣的话):
媒体/libmedia/mediaplayer.cpp,
媒体/libmedia/imediplayer.cpp,
媒体/libmedia/imediplayerclient.cpp,
媒体/libmedia/imediplayerservice.cpp,
媒体/libmediaplayerservice/mediaplayerservice.cpp
libmedia的头文件位于include/media/libmedia/中。
现在来看看真正有趣的部分,它们是组件播放器。在mediaserviceplayer.cpp中,有两个方法决定实例化哪个播放器。midi有舞台灯光框架(awesomeplayer和nuplayer)和sonivox播放器。对于rtsp,nuplayer是你能得到的。您可以在media/libmediaplayerservice/nuplayer/和media/libstagefraght/rtsp/中找到粘合层,以及所有真正的源代码。

08-26 07:12