http://blog.csdn.net/lius1984/archive/2009/04/28/4131393.aspx
前言: 隨著3G的到來,頻寬大了流量費便宜了,手機電視等多媒體應用必將有很大發展, 本人總結以往經驗,跟大家討論一下如何建立一個手機ApsaraVideo for VOD的方案,最後給出了一個初步的用戶端實現效果。歡迎大家討論。
先說架構,出於便於管理和擴充,頻寬節流設定和多使用者並發的考慮,商用方案都會採用流媒體伺服器+WEB伺服器+代理服務器+手機用戶端的方案,其中
流媒體伺服器(streaming server)負責採集視頻源並壓縮編碼並隨時等待來自用戶端的rtsp串連請求;
WEB伺服器(web server)便於發布和管理視頻資訊;
代理服務器(transmission server)是可選的,用於把來自client的RTSP請求轉寄給server,並把伺服器端的即時資料流轉給client,這樣的好處是在相同頻寬下支援更多的使用者同時觀看;
手機用戶端(client)可以用手機內建的播放器(如nokia上的realplayer)或者自己開發的獨立播放器,前者的好處是降低使用者使用門檻,便於大規模應用;後者方便擴充和定製,滿足更多的功能。
streaming server是整個方案的核心,目前主流的流媒體伺服器解決方案如下:
helix server :藉助Real公司的強大實力,這是目前最流行的方案, 可以支援所有音視頻格式,效能穩定,是唯一可以橫跨 Windows Mac 及 Linux, Solaris ,HP/UX 使用者流媒體服務的平台,支援在手機內建播放器播放。helix server免費的版本只支援1M流量,企業版很貴。當然你要破解就是另外一回事了:)
darwin server: 這是apple公司推出的開源的流媒體解決方案,支援格式沒helix那麼多,但由於是開源的免費的,對於開發人員有很大的開發空間。
live555 media server:效能穩定,但支援格式比較少(只有mp3,amr,aac,mpeg4 es等幾種流),很少獨立使用而一般作為系統的一部分。
Windows Media Server:僅限微軟平台,就不考慮了。
手機端架構流程如下:
手機用戶端與伺服器端的傳輸協議目前有HTTP,RTSP兩種,早期的手機電視多用的HTTP,HTTP的優點有不用特殊的伺服器軟體,有IIS即可,不用考慮防火牆NAT,但HTTP不支援即時資料流,也會浪費頻寬; RTSP則是當前流媒體傳輸的主流標準,連微軟都拋棄了MMS而轉而支援RTSP, RTSP可以支援用戶端暫停回放停止等操作,基本不用考慮音視頻同步問題(因為音頻視頻分別從不同RTP PORT讀入緩衝)。值得說明的是,RTSP成功後,就開始RTP傳輸,分為RTP OVER TCP和RTP OVER UDP,前者保證每個資料包都能收到,如果沒收到就重傳,而且不用考慮防火牆NAT;後者只保證盡最大努力的傳輸,不會重傳丟幀,即時性好,要解決防火牆NAT問題。如果對幀率要求比較高的手機電視,推薦採用UDP傳輸,因為延遲較大的重傳資料對使用者是沒有意義的,寧可丟棄。
我在網路部分採用強大的開源庫live555實現RTSP/RTP協議,其效能穩定而且支援大多數音視頻格式的傳輸。(當然ffmpeg也實現了網路傳輸部分,經過改動後也能用)對live555經過裁剪後移植到symbian和windows mobile,這部分工作在symbian真機調試比較費時。
視頻解碼部分當然還是採用ffmpeg,移植了mpeg4 sp/h.264解碼器,在沒有任何最佳化的情況下可支援32K,CIF,5-10fps的效果,對於一般的流媒體應用足夠了。以後還要經過演算法和彙編最佳化。解碼後還需要經過yuv2rgb和scale,需要注意的是ffmpeg的解碼有消隱區的說法,即qcif的映像其linesize不是176而是192,如果你發現解碼後映像呈綠色,需用img_convert()轉一下(目的格式也是PIX_FMT_YUV420P)。symbian上用DSA直接寫屏就行。windows mobile上可以用sdl.
音頻解碼主要包括AAC,AMRNB,AMRWB。AAC和AMRNB是gprs和edge頻寬支援的音頻(aac效果比amrnb好),AMRWB是3G後的音頻格式。在ffmpeg 0.5 release中已經支援amrnb/wb的fixed point解碼,很強大。
在symbian和windows mobile真機均測試通過,6122c真機和Windows mobile5.0模擬器上效果如下:
示範視頻地址為rtsp://v.starv.tv/later.3gp,視頻為mpeg4 sp,音頻為amrwb。目前只能看到映像,音頻還沒加。
注意做流媒體應用存取點一般是cmnet,cmwap只用來瀏覽網頁之類的低資料量應用。
程式還在進一步完善中,有興趣的可以跟我一起交流, lius1984@gmail.com