敲下标题的这一刻,内心还是有点儿小激动的。毕竟虚拟摄像头,也做了几个星期了,硬生生的在android原生系统不支持的情况下,绕过重重限制,完美的实现了这一功能。接下来几天,终于可以睡个好觉了。
好了,闲话少说,我们先来分析下虚拟摄像头。一说到虚拟摄像头,大家印象里,肯定首先想到的是这么一个情景:某个猥琐男在网上正兴致勃勃的撩妹,看着视频里美女漂亮的容颜,不仅春心大动,口水流了一地。而实际上,在网络的另一端,和这猥琐男聊天视频的,根本就不是视频里的美女,而是一位一边抠着脚一边抽着烟的大汉。呃,那么问题来了,这个抠脚大汉,是怎么变成了迷死人不偿命的美女的呢?这其中原理,就是一个虚拟摄像头。抠脚大汉手机端,通过虚拟摄像头技术,将一段事先让美女录好的视频,喂给摄像头接口。摄像头这时读取的,不是真实的实时数据,而是事先录好的这视频里的数据。猥琐男那边,展现出来的,自然也就是录好了的视频了。
上面所说的,是虚拟摄像头的一种应用情景,另外还有一种情景。那就是多个app,同时打开同一个摄像头,预览同一份camera数据。当然,这里所说的多个app打开同一个摄像头,不是指在同一个app里,创建多个surface,让多个surface显示同一份摄像头数据。在同一个app里将camera数据分发到不同的surface上,这很简单,原生的camera框架就支持,具体的可以参考我之前写的那篇博客。
而要让多个app,同时打开同一个摄像头,显示同一份数据,这就有些麻烦了。首先,camera框架,不允许同时有多个app使用camera,哪怕是多个app打开不同id的摄像头。当然,这个限制,也很好破解。我们可以将services/camera/libcameraservice/utils/ClientManager.h这个文件里的ClientManager构造函数,做如下修改:
//这是原生的,mMaxCost表示最多同时可以有多少个app打开camera
template<class KEY, class VALUE, class LISTENER>
ClientManager<KEY, VALUE, LISTENER>: