2013-10-21 22 views
2

檢查MediaPlayer的源代碼(link),該start()方法是這樣的:Android的MediaPlayer如何通過檢查本機代碼來工作?

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

而且_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?

回答

3

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

在media/jni/android_media_MediaPlayer.cpp中,您會發現將Java方法調用轉發到基礎本機框架的JNI代碼。您可以在gMethods[]陣列中看到名稱映射,在文件底部附近看到AndroidRuntime::registerNativeMethods調用。您可以閱讀更多關於使用JNI here註冊本地方法的信息,但這不是真正有趣的部分。

在這個階段,我們在Java MediaPlayer的本地對應部分。大多數情況下,它也沒有做任何有趣的事情。它綁定到MediaPlayerServiceIBinder事務。 MediaPlayerService基於媒體類型創建本地播放器,並維護客戶端(MediaPlayerService::Client)以便於與本地MediaPlayer進行通信,這反過來又使事情回到Java。你可以看到這一切發生在下列文件(如果你有興趣):

媒體/ libmedia/mediaplayer.cpp, 媒體/ libmedia/IMediaPlayer.cpp, 媒體/ libmedia/IMediaPlayerClient.cpp, 媒體/ libmedia/IMediaPlayerService.cpp, 媒體/ libmediaplayerservice/MediaPlayerService.cpp

頭文件爲libmedia是在包括/媒體/ libmedia /。

現在到了真正有趣的部分,哪些是組件玩家。在MediaServicePlayer.cpp中有幾個getPlayerType方法決定了實例化的玩家。 Stagefright框架(AwesomePlayer和NuPlayer)和MIDI的Sonivox播放器。對於RTSP,NuPlayer就是你會得到的。您可以在media/libmediaplayerservice/nuplayer /中找到glue layer,並在media/libstagefright /和media/libstagefright/rtsp /中找到所有真實的源代碼。

+0

我選擇這個作爲答案,因爲它是最詳細和徹底的書面。 –

0

_start方法在JNI定義在這個媒體播放器文件link

從這裏開始libmedia方法獲取調用。

相關問題