[轉載]Symbian上的流媒體視頻實驗(1)

來源:互聯網
上載者:User
原文來自: 手機開發 - chenwayne   http://www.cublog.cn/u/26691/showart_1162401.html

北京理工大學  20981  陳罡3G眼看著就到了(雖然前途到底如何還不知道),但從手機的on-line應用已經一點點熱起來的形勢來看3G的到來一定會給手機軟體開發行業帶來一個比較大的衝擊的。這就好比在大家都用56k modem撥接的時候,沒有人能遇見到現在可以用電腦下載動輒幾個G的高畫質 DVD,可以線上玩3D遊戲,可以線上看電視一樣。於是未雨綢繆偶先來試試,做個demo,驗證一下這個傳說中的手機流媒體線上播放至底有沒有那麼神秘,所謂的“核心技術”到底有多大的門檻。 由於偶是沒有3G的網路條件的,所以只好退而求其次,使用現有的GPRS網路做做線上的流媒體了,而且接觸這方面的技術時間也不長,如果有什麼寫的不對的地方還請各位大俠斧正。 大概看了一遍視頻方面的資料,目前比較成熟的是mpeg4壓縮演算法,其實很多人把mp4檔案格式與mpeg4壓縮演算法搞混了。mpeg4其實只能夠對視頻資料進行壓縮(這裡的“視頻”資料是指純的yuv格式的映像資料,不包含聲音的),相關檔案指出mpeg4最大壓縮比可以達到200:1。mpeg4技術就跟我們平常用到的winzip, winrar一樣只是一個普通的壓縮演算法,所不同的地方在於winzip或winrar用於常規的檔案壓縮,而mpeg4對於生動影像的壓縮效果尤為明顯,可以大大減小影像資料的儲存大小。現在mpeg4演算法出了個part 10,算是比較先進的壓縮演算法了,非官方的叫法是h.264,這個的壓縮比更高,就好像pc上的7z一樣。但是當然,有一利,就一定會有一弊,壓縮比高了自然就是導致了運算量增大,有關資料顯示h.264的運算量比mpeg4大2倍以上,儘管如此,鑒於當前的GPRS頻寬有限,只好採用h.264做為首選了編解碼方案了,畢竟它佔用的頻寬小嘛。 再來看看mp4檔案格式,其實mp4檔案格式與3gp檔案格式一樣,都是符合iso標準的檔案格式。具體的格式定義可以參考文檔ISO/IEC 14496-14 Mp4 file format。其實看過了這個format以後,感覺上就跟html網頁差不多,只不過mp4檔案裡面的tag都是二進位的,而html網頁都是肉眼可讀的ascii碼形式的,其餘的就是各個tag定義的不盡相同。在mp4/3gp檔案裡面不再叫做tag,而是叫做“box”,盒子。mp4和3gp檔案就是由一系列的裝有不同音、視頻資料的“盒子”所組成的,所以解碼播放的時候,只需要把這些“盒子”開啟取出資料,然後解碼顯示、播放即可。所以,如果你聽到用mpeg4編碼的3gp檔案,一定不要驚奇,這很正常,盒子都是一樣的盒子,只不過裡面裝的東西,可以是mpeg4編碼的視頻資料,也可以是h264編碼的視頻資料,也可以是早期手機採用的h263編碼的視頻資料,當然聲音可以是aac也可以是amrnb或者別的什麼。這些只要解碼器支援,就一切ok。這就好像在html網頁裡面<mytag>XYZ</mytag>,兩個tag之間的XYZ可以隨意變化一樣,反正只要複合html的規範寫tag就不會出錯。視頻也是一樣,只要box定義符合iso的標準,它才不管你裡面裝的是什麼資料呢。 hoho,既然決定了編碼器和解碼器都是自己寫了,那麼盒子裡面裝的什麼東西自然就可以自己說得算了,這也是為什麼商用的很多codec都是配對的,有解碼器就一定有對應的編碼器。 對於音訊選型,也不管那麼多了,壓縮比越大越好,品質嘛。。。就不做那麼多考慮了,這隻是一個實驗性質的驗證而已。因此,選擇了amrnb做為音訊壓縮標準,目前看來似乎在低碼率的條件下對聲音的壓縮,最理想的就是它了,而且symbian手機本身就有amr的codec的,這樣省得自己花力氣去寫了。唉,可惜視頻解碼器在手機上還沒有現成的可以用,強烈建議symbian公司給內建一個視頻的解碼器,我不需要調用第三方的應用程式,還是一個解碼器來得實在。 然後就可以胡亂畫一個手機上的流媒體視頻架構設計圖了:

 從圖的下面可以看到Muti-media Stream Format,就是大概設計的編碼器應該編碼出來的視頻和音訊混合在一起的流媒體檔案內部的樣子。然後這裡的sabs和vabs分別代表了音頻資料和視頻資料的資訊,例如總有多少幀,播放時間長度是多少,採用什麼編碼方式,理想狀況下的傳輸速率是多少,音訊資訊還包括採樣率,支援聲道個數等資訊。由於只是實驗,沒有必要把VBR動態碼率的概念引入進來,而且手機估計處理這些也費勁,所以無論是音頻還是視頻,統一採用了靜態碼率CBR了。這樣同步啥的也比較方便一些。 再往下就是具體的資料了,vdat代表裝有視頻資料的“盒子”,adat代表裝有音頻資料的“盒子”,“盒子”裡面記錄了音頻和視頻資料的大小以及同步資訊,例如幀序號,nal頭之類的東西。 從架構的整體來看,是由一個net engine和一個stream player engine組成的,net engine在調試階段可以暫時換成file engine來類比,呵呵,畢竟symbian上面網路部分調好了也不是很容易的事情。大體的工作流程就是由net engine通過GPRS從網路上下載視頻流,這裡我直接套用了以前在blog上貼出來的斷點續傳的引擎的部分代碼,從http伺服器上,利用斷點續傳技術直接下載視頻資料,下載到media queue這個隊列裡面,如果下載滿了,就暫停下載,如果media queue資料不夠了,就利用斷點續傳,從剛剛停下來的地方開始繼續下載。 然後,就進入到stream divider這個模組,這個所謂的divider是用於把音頻、視頻混合在一起的流資料進行分流,這可能也是通常所說的filter過濾器,把視頻資料引入到h264 queue裡,把音頻資料引入amrnb queue裡,然後由各自的解碼器進行解碼。 h264 codec可以採用開源的ffmpeg項目中的libavcodec。這個libavcodec過於強大了,可以經過適當裁剪後使用(這說起來是輕描淡寫,呵呵,做過的朋友在此該跟偶是心有戚戚焉了:P);amr codec既可以使用手機內建的amr codec,也可以自己移植一個。hoho,偶是沒有偷懶,自己移植了一個amrnb的解碼器,想來這工作挺多餘,但是如果想想這意味著可以在win mobile上也跑起來,那還是值得的。至於那些queue,估計看過Richard Stevens的《Unix網路編程》的朋友們自然都是不在話下的。 最後來說說這個顯示問題,從libavcodec解碼出來的映像都是yuv格式的,需要一個轉換的程式把yuv格式轉換成為rgb565的格式(其實symbian手機也是支援rgb32的,但是考慮到過日子能省則省這一點,所以還是採用了rgb565的方式)。然後就是為了加快顯示速度,使用CDirectScreenAccess這個類了,不清楚的朋友可以查閱symiban 3rd的sdk help。 回過頭來說聲音,聲音這塊在symbian上還是非常方便的。系統直接提供了可以播放pcm16格式的聲音介面,CMdaAudioOutputStream,這個類需要說道說道。如果要使用這個類必須實現三個純虛函數:void MaoscOpenComplete(TInt aError) ;
void MaoscBufferCopied(TInt aError, const TDesC8 &aBuffer) ;
void MaoscPlayComplete(TInt aError) ; 這裡的MaoscBufferCopied這個函數比較重要,每次資料讀取完畢了以後,手機系統會自動回調這個函數,你必須把資料給系統,否則就出錯;幸好symbian提供了一個WillResumePlay()的函數,呵呵,如果回呼函數回調的時候恰好沒有可以用的pcm資料給它的時候(你當大家是地主啊,你要的時候就一定有),就可以調用這個函數來推掉這次請求資料,那麼下次只要資料足夠多了,執行一下write操作,就又會啟動回呼函數索取資料的機制。這就為網路狀況不佳的時候重新繼續播放視頻成為了可能。 最後就是同步策略了,基本的思路是以音頻為主,視頻為輔,音頻稍微有延遲就可以聽出來,而對於視頻而言,由於視訊框架都是連續的,適當丟掉一幀兩幀都是完全沒有問題的。經過大概一個多星期的努力,總算實現了上述所示的整個架構,還順手把mp3的streaming播放也搞了出來。在symbian 3rd n81平台上測試通過。 調試過程中的:

伺服器不定時會關掉,在使用手機程式測試之前需要確定如下的url可以訪問:http://211.94.72.137/test/b.mp3http://211.94.72.137/test/b.ms 然後就是安裝程式了,在此只提供一個沒有sign過的sis包,需要測試的朋友可以自己sign一下,只使用了如下的capability : ReadUserData WriteUserData ReadDeviceData WriteDeviceData LocalServices NetworkServices NetworkControl CommDD TrustedUI UserEnvironment  安裝包下載(這裡是沒有sign過得sis,需要自己sign一下才行)

檔案: Mp3Test_S60_3_X_v_1_0_0.rar
大小: 344KB
下載: 下載

使用方法:(1)修改cmnet存取點名字,名字改為"INTERNET"(注意,必須全部大寫)(2)修改cmwap存取點名字,名字改為"WAP over GPRS"(注意,大小寫必須一樣)這兩點對不住各位了,測試的時候圖省事直接把這兩個寫死在程式裡面了。(3)開啟程式,就可以隨意使用了。(4)選擇cmwap h264或者cmwap h264就會開始自動連網播放視頻(cmwap的時間稍微長一點)(5)播放過程中可以選擇pause暫停播放,選擇resume可以繼續播放。(6)可以從上面的連結中下載ms檔案和mp3檔案到手機上,利用local h264或local mp3播放。這裡的local模式的播放都是“迴圈”模式播放的,播放完畢後,又會從頭開始播放。(7)pause和resume同樣對本地播放有效。(8)左右方向鍵可以調整音量,左方向鍵減小音量,右方向鍵增大音量。 這個測試最大的好處在於伺服器端部署極為方便,不需要複雜的視頻伺服器配置(當然複雜有複雜的好處了,可以實現更加精準的定位和控制),有一台普通的apache或者tomcat即可使用,也可以配合free wap,利用mdl或者類似的關聯技術,實現在wap網頁上單擊某個視頻,就可以直接調用播放器線上播放的效果。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.