检查源代码中的MediaPlayer
(link),方法如下所示:
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
事务绑定到IBinder
。MediaPlayerService
根据媒体类型创建实际的本机播放机,并维护一个客户端(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/中找到粘合层,以及所有真正的源代码。