1. 程式人生 > >Android中流媒體(一)基礎概念

Android中流媒體(一)基礎概念

一.常識
(一).視訊傳輸編碼
(1)MPEG 參考連結:http://baike.baidu.com/view/1645953.htm
1.1 MPEG:視訊編碼標準是主要應用於實時視訊通訊領域,如會議電視;MPEG系列標準是由ISO/IEC制定的,
主要應用於視訊儲存(DVD)、廣播電視、因特網或無線網上的流媒體等。


1.2 現存的標準:數字視訊技術廣泛應用於通訊、計算機、廣播電視等領域,帶來了會議電視、可視電話及數字電視、媒體儲存等一系列應用,
促使了許多視訊編碼標準的產生。ITU-T與ISO/IEC是制定視訊編碼標準的兩大組織,ITU-T的標準包括H.261、H.263、H.264,
兩個組織也共同制定了一些標準,H.262標準等同於MPEG-2的視訊編碼標準,而最新的H.264標準則被納入MPEG-4的第10部分。
(2)ffmpeg 參考連結:http://baike.baidu.com/link?url=70UHk1glgCTfRjTbwmr3O7NjHHhLtKjbL7p9gaHA3pv_PeyTT0cL1Bp00o0CvGYclT0-lKFEEjPM3VAxsDl-dq
1.1 ffmpeg :FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。
它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,
libavcodec裡很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行,包括Windows、Mac OS X等。這個專案最早由Fabrice Bellard發起,
現在由Michael Niedermayer維護。許多FFmpeg的開發人員都來自MPlayer專案,而且當前FFmpeg也是放在MPlayer專案組的伺服器上。
專案的名稱來自MPEG視訊編碼標準,前面的"FF"代表"Fast Forward".




(二)Android5.0 NuPlayer多媒體框架(參考:http://blog.csdn.net/mandagod/article/details/47207511)
(1)概況:
Android流媒體框架在Gingerbread Android2.3版本的時候加入的,其中實現的核心就是NuPlayer。
在之前的版本中一般認為Local Playback就用Stagefrightplayer+Awesomeplayer,流媒體用NuPlayer。從現在來看,NuPlayer大有替換掉StagefrightPlayer+AwesomePlayer的趨勢,
現在NuPlayer也可以完美地實現本地播放。
Android2.3時引入流媒體框架,而流媒體框架的核心是NuPlayer。Android4.0之後HttpLive和RTSP協議開始使用NuPlayer播放器,Android5.0(L版本)之後本地播放也開始使用NuPlayer播放器。
在實現上NuPlayer和Awesomeplayer不同,NuPlayer基於StagefrightPlayer的基礎類構建,利用了更底層的ALooper/AHandler機制來非同步地處理請求,
ALooper列隊訊息請求,AHandler中去處理,所以有更少的Mutex/Lock在NuPlayer中。AHnadler機制請參考前面的一篇文章,AHandler機制。
Android5.0之前,StageFright架構使用的傳遞訊息機制是TimedEventQueue模型
Android升級到5.0之後,NuPlayer使用的是AHandler訊息機制,類似於Handler (Android5.0之前,StageFright架構使用的傳遞訊息機制是TimedEventQueue模型)
Awesomeplayer中利用了omxcodec而NuPlayer中利用了Acodec。
Android流媒體在5.0上資原始檔主要分為HTTPLiveSource、RTSPSource GenericSource,其中GenericSource是4.1版本加入的。其中RTSP和HLS流是最主要的,
兩者本別基於RTSP協議和HLS協議。 
(2)AHandler機制
Android APP開發中為了不阻塞UI執行緒,利用handler,把UI執行緒分開非同步執行,使用handler去執行某項比較費時的操作,然後非同步更新UI執行緒。這部分是用Java來實現的,
和傳統Java的執行緒機制很類似。
流媒體(5.0中用的是NuPlayer)中也是類似的,因為聯網,codec都很費時,需要非同步執行。AHandler機制基於C++的實現,NuPlayer就是繼承了AHandler,
實際上就是用的AHandler。
對於handler訊息機制,構成就必須包括一個Loop,message。那麼對應的AHandler,也應該有對應的ALooper, AMessage。底層的多媒體框架NuPlayer中,
都是用AHandler訊息機制實現的。
(3)音視訊同步
在NuPlayer框架中,音視訊同步的工作是由Renderer來完成的,而在StageFright框架, Render是顯示用的。
NuPlayer框架中,音視訊同步的策略是音/視訊往後delay,被動同步,而不會主動seek;簡單講就是如果視訊來早了會等一下音訊,如果視訊來晚了會通過丟幀機制同步,
連續丟幀直到音視訊同步上為止,因為音訊太敏感,所以只視訊做此處理,而音訊不做這樣的處理,總之策略就是:視訊早等晚丟。
Stagefright框架中,音視訊同步的策略是,視訊向前向後雙向同步,too late時video會主動往前seek;too early的時候video會delay
在NuPlayer的start步驟中,新建了一個Renderer的迴圈執行緒mRendererLooper,並且把mRenderer作為這個迴圈執行緒的Handler,在這個執行緒內對音視訊資料進行同步、送顯等操作 。


(4)渲染
渲染器是3D引擎的核心部分,它完成將3D物體繪製到螢幕上的任務。渲染器分為硬體渲染器和軟體渲染器組成。
渲染器是3D引擎的核心部分,它完成將3D物體繪製到螢幕上的任務。渲染器分為硬體渲染器和軟體渲染器:
1.硬體渲染器通常基於底層圖形API(應用程式介面)構建,採用適合硬體架構的光柵化方法進行渲染。圖形API負責與硬體的通訊,常用的圖形API包括DirectX和OpenGL。
OpenGL API通過OpenGL圖形庫來使用3D硬體,多數3D卡支援這種方法。而DirectX API使用微軟的DirectX庫——歸併到 Windows作業系統中。在老的3D卡上面,
OpenGL一般繪製速度較快一些,而在現代的3D卡上面,DirectX表現則更加出色。現在的OpenGL版本只有一個,而DirectX版本有很多。DirectX通過提供更新版本的方式來擴充套件功能,
而OpenGL通過一個通用的擴充套件(OpenGL Ext)來對功能進行擴充套件。
2.軟體渲染器則純粹利用CPU的能力進行計算,通常採用光線追蹤的方法進行渲染。軟體渲染器沒有統一的應用程式標準,但是有很多通用的渲染演算法,如光子對映,
蒙特卡洛,輻射度等等。
3.硬體渲染器和軟體渲染器應用領域不同:硬體渲染器主要用於實時渲染,比如遊戲和虛擬現實。而軟體主要用於離線渲染,比如效果圖和影視級、產品級渲染。
這主要是因為硬體渲染器的速度快但是靈活度不足,而軟體渲染器雖然速度不夠理想但是可以使用非常複雜的渲染演算法,達到相片級的真實度和效果