音视频直播技术--SurfaceView、GLSurfaceView与TextureView

movive.jpg

前言

今天给大家介绍一下在Android系统下视频如何渲染与展示。 我们都知道一个直播客户端对音视频的处理主要由以下几大部分组成:1. 数据采集; 2. 编码; 3. 传输; 4. 解码;5.渲染与展示。 前些日子为大家讲了一下如何通过Camera进行数据采集,没看过的可以看一下。今天讲的就是渲染与展示。

说到展示部分就不得不说 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线程用于绘制,渲染线程用于纹理的计算。
1. 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2. 由于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


微信公众号