天天看點

Chromium Media Player1        Overview2        Code Read

近來在搞Chromium的Media Player,本來想好好寫點東西,可是一直也沒有組織好如何寫,世事變遷,弄不好過些日子又去搞别點什麼了,即使是半成品也貼出來吧,總比什麼都沒有留下來強。

1        Overview

Chromium是由Google維護的一個浏覽器項目,由于本文主要就是想記錄一下近期閱讀其媒體處理部分代碼的心得,是以其諸多長處也就沒有必要在這裡描述了。Chromium的整個代碼量非常龐大,使用VC++打開有600來個工程,完全編譯也需要耗時幾個小時,但是我感覺Google其實就是做了一個融合的工作,把很多優秀的開源項目及已有技術恰到好處的為己所用,當然這需要有很豐富的經驗及架構能力。Chromium的媒體處了解碼用的是ffmpeg,其主要的代碼集中在src/media目錄下。

1.1  Run a Sample

Chromium支援hteml5,是以我們可以寫一個包含video标簽的html把Chromium中MediaPlayer運作起來看看效果,代碼如下:

<!DOCTYPE HTML>

<html>

<body>

<video src="bear.ogv" width="320" height="240" controls="controls" autoplay="autoplay">

   Your browser does not support the video tag.

</video>

</body>

</html>

由于版權等的問題從Chromium Project下載下傳來的代碼在ffmpeg中隻打開了對于ogv格式的支援,是以這裡使用ogv作為video source,其中bear.ogv在Chromium的源碼目錄中可以找到。如果想支援更多格式可以自己配置ffmepg并重新編譯即可,ffmepg的代碼在src/Third_party/ffmpeg目錄下。上面的例子成功運作的效果如下:

Chromium Media Player1        Overview2        Code Read

2        Code Read

2.1  了解的邊界

對于複雜系統的了解我們一般需要設定一個邊界,隻了解邊界以内的,這樣會使了解相對簡單,就像我們看由于工作的需要及了解的有限,我主要關注的是MediaPlayer的Video部分,對于Audio關注的比較少,但是在整體的架構上應該是相同的,使用Class Diagram和Sequence Diagram來說明MediaPlayer的整體結構及運作的邏輯。另外由于Chromium的代碼實在龐大且是個多程序多線程的系統,為了實作解耦及可擴充性還包裝了很多層次,很多的任務調用都使用到了回調及狀态機等機制,對于一個調用要想完全的追根溯源有很大難度,而且由于我的關注點在MediaPlayer,是以很多時候把MediaPlayer以外的調用者就作為Actor了,這樣在一定的Level上了解簡單一些。很多調用是由WebMediaPlayerClientImpl類發起的,是以把WebMediaPlayerClientImpl的方法作為Actor。

2.2  WebMediaPlay的邊界

Chromium Media Player1        Overview2        Code Read

上面這張圖展現的一些類應該屬于MediaPlayer整個架構的High Level,說明MediaPlayer與Chromium整體的一些關聯。其中WebMediaPlayerImpl是實作MediaPlayer的類,使用者對于MediaPlayer的操作最終都會分派到它去具體執行,之後就會具體的調用到Demux/ Decoder/ Renderer等。

Chromium Media Player1        Overview2        Code Read

下面是幾張Call stack

Chromium Media Player1        Overview2        Code Read
Chromium Media Player1        Overview2        Code Read
Chromium Media Player1        Overview2        Code Read

繼續閱讀