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.youkuaiyun.com/elfylin/article/details/7455999

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值