Android特效直播实现原理解析特效直播实现原理解析
这篇文章主要讲解下目前市面上比较新颖的特效直播,比如Faceu激萌等软件的具体实现原理。
如上图所示,要实现特效直播至少需要实现这五个模块:相机采集、设备运动方向检测、人脸识别功能、本地预览绘
制以及编码发送。下面我们就逐个介绍下在Android端这个五个功能的大致实现原理。
Camera采集
想正常的看到摄像头所采集的图像?只需要给Camera指定一个SurfaceView,具体来讲是给相机设置一个画布
(SurfaceHolder)即通过Camera setPreviewDisplay方法,就可以了。这是由于Android的系统API对Camera进行了
很好的封装,使得我们可以非常快速的开发一个相机应用。
但在特效直播中,我们需要对相机采集的图像进行处理,比如美颜或是贴上兔耳朵、牙齿等道具图片。然后将处理过
的图像显示到屏幕上实时进行观看。这时候让系统帮我们绘制相机图像显然就不合适了。
SurfaceTexture
这是Android API文档中关于SurfaceTexture的描述,从中我们可以看到SurfaceTexture可以代替SurfaceHolder来接受
Camera采集的数据流同时不显示到屏幕上。由此可见要实现特效直播首先需要将Camera采集的SurfaceHolder模式替
换为SurfaceTexture模式。
方向检测
在处理相机预览时,Android系统为了保证用户无论怎么旋转手机都能看到“正确”的预览画面(这个“正确”是指显示在UI
预览界面的画面与你人眼看到的眼前的画面是一致的),系统底层会根据当前手机屏幕的方向对图像Sensor采集到的
数据进行了旋转处理,然后才送给显示系统进行显示。因此在采用SurfaceHolder模式下由于系统底层帮我们进行了方
向上的处理,因此我们看到的画面都是正的。但在采用SurfaceTexture模式后,由于系统直接向数据流送给了
SurfaceTexture,因此在我们自己绘制以及人脸识别时就需要知道设备的预览方向,来保证绘制的角度正确以及人脸
识别的成功率。
在Android上我们可以通过OrientationEventListener来实现实时屏幕方向的监听。