Android 特效直播实现原理解析

作者简介:

2010年开始从事Android开发工作,网易资深开发工程师,主要负责视频云Android端的直播SDK开发与维护工作。

这篇文章主要讲解下目前市面上比较新颖的特效直播,比如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来实现实时屏幕方向的监听。

具体的实现代码也很简单,只需要实现OrientationEventListener中的onOrientationChanged方法就可以实时获取到屏幕方向了。

人脸识别

Android系统本身就具有人脸识别功能,其中包括静态人脸检测和动态人脸检测。所谓的静态检测即通过android.media.FaceDetector 这个类对单张图片进行识别,然后识别出图片中的人脸位置。

在Android 4.0以前需要实现相机实时的人脸识别,只能通过获取Camera采集回调onPreviewFrame将Camera采集的帧数据转化为bitmap送给FaceDetector进行检测。网上有人也实现过这种方式。

但这种方式实现效率太低,在直播这种场景下基本没人这么做。

在Android 4.0之后,Camera新增了FaceDetectionListener接口

我们可以通过在开启Camera时设置FaceDetectionListener,来让系统帮我们进行实时的相机人脸检测。FaceDetectionListener可以检测出人脸的大小框以及眼睛和嘴巴的位置。这里有一个需要注意的是检测到人脸rect默认是以预览界面为坐标系,这个坐标系是经过变换的,中心点为(0, 0),左上顶点坐标是(-1000, -1000),右下顶点是(1000, 1000).也就是说不管预览预览Surfaceview多大,检测出来的rect的坐标始终对应的是在这个变换坐标系。而Android里默认的view的坐标系是,左上顶点为(0, 0),横为x轴,竖为y轴。这就需要把rect坐标变换下。

基本上简单的需求FaceDetectionListener就可以满足了。但复杂的需求,如检测鼻子,眉毛以及平台通过性和对性能要求极高的场景下FaceDetectionListener也有点力不从心了。

目前市面上很多的人脸识别都是基于开源项目OpenCV实现的,OpenCV也有Android平台的实现。对于如何在Android上集成OpenCV的方式,有兴趣的同学可以参考下

OpenGL绘制与编码

SurfaceTexture是GPU纹理,天生与openGL亲近。因此Camera采用SurfaceTexture方式基本上都是通过GLSurfaceView的Render生成SurfaceTexture纹理然后绑定Camera进行绘制,同时可以将SurfaceTexture上Camera采集的数据直接进行硬件编码,提供编码效率。

SurfaceTexture方式由于需要OpenGL基础以及硬件编码相关知识,因此本文中就暂不介绍了,等先普及过OpenGL相关知识后再进行讲解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容