轉載請注明出處: http://www.cnblogs.com/fangkm/p/3791964.html
在PC瀏覽器中播放視頻,大部分視頻網站都是采用flash播放器,這多虧了Adobe Flash Player龐大的裝機量。但Flash Player對於瀏覽器來說就是一個插件,插件內部下載flv流、解析flv視頻格式、播放視頻等流程與瀏覽器都沒有太大關系。瀏覽器新標准HTML5中增加了視頻支持,如:<video src="movie.ogg"> </video>,video 元素當前支持三種視頻格式:Ogg、MPEG 4、WebM。下面分析下Chromium源碼中視頻的播放流程。
視頻播放流程有點復雜,下面還是從源頭一點一點摸索。當blink遇到<video> tag時,會創建對應的Element對象HTMLVideoElement,同樣遇到<audio> tag時會創建HTMLAudioElement對象.(其他tag對應的創建對象請參見core/scripts/make_names.pl腳本生成的HTMLElementFactory.cpp文件)
HTMLVideoElement和HTMLAudioElement都是從HTMLMediaElement派生,接下來着重分析下
HTMLMediaElement類. 該類的結構圖如下所示:
從結構可以看出,媒體播放邏輯抽象在MediaPlayer接口中, HTMLMediaElement的createMediaPlayer方法調用MediaPlayer的靜態方法create來創建MediaPlayer對象,分析一下create的實現,其創建對象的邏輯依賴於由靜態方法setMediaEngineCreateFunction
來指定,在初始化webkit的時候就通過該方法指定WebMediaPlayerClientImpl::create創建函數,從而最終創建WebMediaPlayerClientImpl對象來實現MediaPlayer接口邏輯。
然而WebMediaPlayerClientImpl也只是一層殼,它並沒有真正的實現媒體相關邏輯,而是轉接給WebMediaPlayer接口,相關結構如下:
WebMediaPlayerClientImpl通過依賴WebFrameImpl的WebFrameClient成員來創建WebMediaPlayer實現對象,通過WebMediaPlayerClient接口來響應WebMediaPlayer的相關事件, RenderViewImpl最終承接創建WebMediaPlayer的任務,其創建WebMediaPlayerImpl對象,並通過WebMediaPlayerDelegate接口來響應WebMediaPlayerImpl的相關事件。
下一篇文章開始分析WebMediaPlayerImpl部分, 這部分才真正開始音視頻的相關邏輯。