­

音影片直播技術–影片的渲染與展示

movive.jpg

前言

今天給大家介紹一下在Android系統下影片如何渲染與展示。 我們都知道一個直Podcast戶端對音影片的處理主要由以下幾大部分組成:1. 數據採集; 2. 編碼; 3. 傳輸; 4. 解碼;5.渲染與展示。 今天講的就是渲染與展示。

說到展示部分就不得不說 View。View 表示螢幕上的一塊矩形區域,負責繪製這個區域和事件處理。Andorid系統提供了幾種不同的View用於影片的展示,它們分別是 SurfaceView, GLSurfaceView 和 TextureView。

Surface是個啥?

在比較各種 View 之前,我們有必要先了解一下 Surface 和 SurfaceHolder 的概念。

Surface

Surface 可以把它理解為一個Buffer,它是一塊螢幕緩衝區。每個Window(窗口)對應一個Surface,任何View都是畫在Surface上的。

Surface是縱深排序(Z-ordered)的,這表明它總在自己所在窗口的後面。Surfaceview 提供了一個可見區域,只有在這個可見區域內的Surface部分內容才可見,可見區域外的部分不可見。

傳統的View共享一塊螢幕緩衝區,所有的繪製必須在UI執行緒中進行。由於UI執行緒是主執行緒,如果影片的繪製也與UI放在一個執行緒中,那麼它將嚴重影響主執行緒工作。所以Android又提供了其它View,這些View可以通過其它執行緒進行渲染。

SurfaceHolder

它是 Surface 的抽象介面,它使你可以控制Surface的大小和格式,以及在Surface上編輯像素和監視Surace的改變。這個介面通常通過SurfaceView類實現。

各種View大比較

下面我們來比較一下 SurfaceView、GLSurfaceView 和 TextureView。

SurfaceView

SurfaceView繼承於View,它從 Android 1.0 時期就存在。他包含一個Surface模組,所以SurfaceView與普通View的區別就在於他的渲染在單獨的執行緒進行。這對於一些遊戲、影片等性能相關的應用非常有益,因為它不會影響主執行緒對事件的響應。

但同時,由於它不在由Android系統的WMS(Windows Manager Service)管理,所以它也不會像普通View那樣可以通過View屬性控制進行平移,縮放等變換,也不能放在其它ViewGroup中,一些View中的特性也無法使用。

Surfaceview的核心在於提供了兩個執行緒:UI執行緒和渲染執行緒。UI執行緒用於繪製,渲染執行緒用於紋理的計算。

  • 所有SurfaceView和SurfaceHolder.Callback的方法都應該在UI執行緒里調用,一般來說就是應用程式主執行緒。渲染執行緒所要訪問的各種變數應該作同步處理。
  • 由於Surface可能被銷毀,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之間有效,所以要確保渲染執行緒訪問的是合法有效的Surface。

GLSurfaceView

GLSurfaaceView也繼承於View,它從 Android 1.5 開始加入。它的加入是為了解決SurfaceView渲染執行緒要單獨寫開發難度大這個問題而引入的。在 SurfaceView 的基礎上,它加入了EGL的管理,並自帶了渲染執行緒。另外它定義了用戶需要實現的Render介面,提供了用Strategy pattern更改具體Render行為的靈活性。我們在使用 GLSurfaceView 時,只需要重新實現 Renderer 類,並將它設置給GLSurfaceView即可。

TextureView

TextureView 同樣繼承於View,它在4.0(API level 14)中引入。由於發現GLSurfaceView 不能根據螢幕的變化而變化,所以引入了 TextureView。TextureView 重載了draw()方法,其中主要把SurfaceTexture中收到的影像數據作為紋理更新到對應的HardwareLayer中。所以TextureView必須在硬體加速的窗口中(可以通過 Android的配置文件進行設置)。因為TextureView不包含Surface,所以其實就是一個普通的View,可以和其它普通View一樣進行移動,旋轉,縮放,動畫等變化。

什麼是SurfaceTexture

SurfaceTexture就是紋理,你可以把它想像成一個距陣緩衝區。從Camera中採集的數據或從解碼器中取出的數據可以放到SurfaceTexture里進行二次處理,然後再交給View去展示。

它的好處是,可以做各種濾鏡。像直播中經常用到的美顏,水印等都可以通過它來處理。

推見文章

http://blog.csdn.net/jinzhuojun/article/details/44062175

參考

http://www.jianshu.com/p/f432bfe8ce15 http://www.jianshu.com/p/e8da1bf61bc7