zz Android HTML5 video play

1.How will the HTML call video player in the webpage? (from dom parsing to mediaplayer)

HTMLMediaElement::updatePlayState()->
HTMLMediaElement::m_player->play()->
MediaPlayer.cpp(in webkit)->play()//(this file use factory create player)->
MediaPlayerPrivateInterface->play()->
MediaPlayerPrivateAndroid.play()->android/webkit/HTML5VideoViewProxy.play()->
VideoPlayer.play(HTML5VideoViewProxy.java)->
HTML5VideoView.start()/HTML5VideoFullScreen/HTML5VideoInline.start()->
MediaPlayer.start(MediaPlayer.java)->(android_media_MediaPlayer.cpp)._start()

路徑

external/webkit/Source/WebCore/platform/graphics/MediaPlayer.h

external/webkit/Source/WebCore/platform/graphics/MediaPlayer.cpp

external/webkit/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
external/webkit/Source/WebCore/platform/graphics/android/MediaPlayerPrivateAndroid.h


2. player JNI relationship in Webkit

MediaPlayerPrivateAndroid.cpp 's jni class 
"android/webkit/HTML5VideoViewProxy" and "android/webkit/HTML5Audio"

父類MediaPlayerPrivate中定義了一個

struct MediaPlayerPrivate::JavaGlue {
    jobject   m_javaProxy;
    jmethodID m_play;
    jmethodID m_teardown;
    jmethodID m_seek;
    jmethodID m_pause;
    // Audio
    jmethodID m_newInstance;
    jmethodID m_setDataSource;
    jmethodID m_getMaxTimeSeekable;
    // Video
    jmethodID m_getInstance;
    jmethodID m_loadPoster;
};

在子類MediaPlayerVideoPrivate 和 MediaPlayerAudioPrivate 構造函數中找到java函數記錄到這個glue結構體中

There three classes in "MediaPlayerPrivateAndroid.cpp"

"MediaPlayerPrivate" as basic class;

"MediaPlayerVideoPrivate" as subclass for "android/webkit/HTML5VideoViewProxy"

"MediaPlayerVideoPrivate" as subclass for "android/webkit/HTML5Audio"

 

3. HTML5VideoView

in "VideoPlayer" (HTML5VideoViewProxy.java) we use "HTML5VideoView" for play.

how many kinds of HTML5VideoView are used?

a."HTML5VideoView" as basic class

b."HTML5VideoFullScreen" is used for full screen playing

c."HTML5VideoInline" is used when it's not full screen.

 

4. Timer in HTML5VideoView

a.HTML5VideoView.start();

mTimer.schedule(new TimeupdateTask(mProxy),
 TIMEUPDATE_PERIOD, TIMEUPDATE_PERIOD);

b. in TimeupdateTask's run()

        public void run() {
            mProxy.onTimeupdate();
        }

c. in HTML5VideoViewProxy.java

    public void onTimeupdate() {
        sendMessage(obtainMessage(TIMEUPDATE));
    }

d. in HTML5VideoViewProxy.java

nativeOnTimeupdate(msg.arg1, mNativePointer);

e. finally MediaPlayerPrivateAndroid.cpp

static void OnTimeupdate(JNIEnv* env, jobject obj, int position, int pointer)
{
    if (pointer) {
        WebCore::MediaPlayerPrivate* player = reinterpret_cast<WebCore::MediaPlayerPrivate*>(pointer);
        player->onTimeupdate(position);
    }
}

f. HTMLMediaElement::mediaPlayerTimeChanged (why is this, i am trying to find out)


From http://blog.csdn.net/elfylin/article/details/7455999

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章