Android的MediaPlayer如何通过检查本机代码来工作?



检查源代码的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

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

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

在这个阶段,我们处于 Java MediaPlayer的本机对应物 .在大多数情况下,它也没有做任何有趣的事情。它通过IBinder事务绑定到MediaPlayerServiceMediaPlayerService根据媒体的类型创建实际的原生播放器,并维护一个客户端(MediaPlayerService::Client)以促进与原生MediaPlayer的通信,这反过来又将事情发回Java。您可以在以下文件中看到所有这些情况(如果您有兴趣):

media/libmedia/mediaplayer.cpp, media/libmedia/IMediaPlayer.cpp, media/libmedia/IMediaPlayerClient.cpp, media/libmedia/IMediaPlayerService.cpp, media/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/中找到所有真实的源代码。

你错过了这一步。Java 代码中的private native void _start()引用 MediaPlayer JNI 层中的此条目(引用此函数)。

至于RTSP实现,你可能会在Stagefright来源中找到它。

_start方法在此媒体播放器文件链接的 jni 中定义

从这里调用 libmedia 启动方法。

最新更新