用于摄像头数据分发的方法及装置与流程

文档序号:12496735阅读:554来源:国知局
用于摄像头数据分发的方法及装置与流程

本发明涉及数据处理领域,具体而言,涉及一种用于摄像头数据分发的方法及装置。



背景技术:

一般地,智能操作系统会提供一套封装好的摄像头获取数据源视图框架,提供摄像头打开、关闭、获取摄像头原始数据等功能。这种方式最明显的缺陷在于系统中摄像头同一时间仅能响应一个应用程序,因此在多个应用程序同时用到摄像头的场景中则无法进行响应。另一方面,在多个应用程序同时使用摄像头,并且在不同的进程当中,更是无法实现所有需要摄像头内部数据的应用程序同时分发,使多个应用程序可以同时对图像数据进行处理。



技术实现要素:

本发明的目的是解决目前智能操作系统无法满足多个应用程序同时使用摄像头的需求这一技术问题。

根据本发明的一方面,提出一种用于摄像头数据分发的方法。所述方法包括:对摄像头对应的开、关相关API进行封装,禁止摄像头所在设备中的应用程序直接调用;在所述摄像头处分别注册应用程序各自对应的监听接口;对所述监听接口进行封装,以供各应用程序分别进行调用;目标应用程序请求与摄像头连接时,通过所述目标应用程序对应的监听接口分别将所述摄像头与对应的目标应用程序进行连接;在所述目标应用程序与所述摄像头连接成功之后,进行摄像头与目标应用程序之间的数据实时分发;当全部目标应用程序都退出与所述摄像头的连接,则将所述摄像头关闭。

优选地,当所述目标应用程序与所述摄像头连接成功之后,将摄像头采集的视频数据分别逐帧发送给所述目标应用程序。

优选地,当所述目标应用程序与所述摄像头连接成功之后,在摄像头的内部缓存待发送的图像帧,并在实时发送给各目标应用程序的同时,缓存所述图像帧的下一帧,直至摄像头关闭。

优选地,当所述目标应用程序与所述摄像头连接成功,则摄像头引用计数加1;当目标应用程序退出与所述摄像头的连接,则摄像头引用计数减1。

优选地,当所述摄像头引用计数为0,将所述摄像头关闭。

根据本发明的另一方面,提出了一种用于摄像头数据分发的装置。该装置可以包括:用于对摄像头对应的开、关相关API进行封装的单元,以禁止摄像头所在设备中的应用程序直接调用;用于在所述摄像头处分别注册应用程序各自对应的监听接口的单元;用于对所述监听接口进行封装的单元,以将所述监听接口供各应用程序分别进行调用;用于在目标应用程序请求与摄像头连接时,通过所述目标应用程序对应的监听接口分别将所述摄像头与对应的目标应用程序进行连接的单元;用于在所述目标应用程序与所述摄像头连接成功之后,进行摄像头与目标应用程序之间的数据实时分发的单元;用于当全部目标应用程序都退出与所述摄像头的连接,则将所述摄像头关闭的单元。

优选地,当所述目标应用程序与所述摄像头连接成功之后,将摄像头采集的视频数据分别逐帧发送给所述目标应用程序。

优选地,当所述目标应用程序与所述摄像头连接成功之后,在摄像头的内部缓存待发送的图像帧,并在实时发送给各目标应用程序的同时,缓存所述图像帧的下一帧,直至摄像头关闭。

优选地,当所述目标应用程序与所述摄像头连接成功,则摄像头引用计数加1;当目标应用程序退出与所述摄像头的连接,则摄像头引用计数减1。

优选地,当所述摄像头引用计数为0,将所述摄像头关闭。

根据本发明的用于摄像头数据分发的方法及装置,通过对摄像头资源进行封装,并向所有需要摄像头数据的应用程序同时分发摄像头的数据,因此多个应用服务可以同时对摄像头的图像数据进行处理,从而使得摄像头资源的使用不受进程个数、应用程序个数的限制,同时规避了摄像头频繁开启关闭带来的各种失败或异常,大大提升了摄像头的准确性和稳定性。并且本发明采用摄像头内部数据缓存机制,提高了数据访问效率。

本发明的方法具有其它的特性和优点,这些特性和优点从并入本文中的附图和随后的具体实施例中将是显而易见的,或者将在并入本文中的附图和随后的具体实施例中进行详细陈述,这些附图和具体实施例共同用于解释本发明的特定原理。

附图说明

通过结合附图对本发明示例性实施例进行更详细的描述,本发明的上述以及其它目的、特征和优势将变得更加明显,其中,在本发明示例性实施例中,相同的参考标号通常代表相同部件。

图1为根据本发明的一个实施例的用于摄像头数据分发的方法的流程图。

图2为在应用示例中多个应用程序与摄像头连接的示意图。

具体实施方式

下面将参照附图更详细地描述本发明。虽然附图中显示了本发明的优选实施例,然而应该理解,可以以各种形式实现本发明而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。

本发明中的智能操作系统通常为Android系统。通常,外部应用程序通过Android系统提供的Camera类来访问摄像头。然而,系统自带的Camera应用有许多限制,最重要的就是多个应用程序不能同时调用摄像头。当一个应用程序占用了摄像头资源时,其他程序则无法使用摄像头。

图1示出了根据本发明的一个实施例的用于摄像头数据分发的方法的流程图。

本实施例的方法可以包括以下步骤:

1)对摄像头对应的开、关相关API进行封装,禁止摄像头所在设备中的应用程序直接调用。

Camera是应用层软件直接使用的类,涵盖了启动、预览、拍照、录像及关闭等操作摄像头的全部接口。摄像头所在设备中的应用程序是通过调用系统自带的Camera类的开(Open)函数来打开摄像头的,也就是通过调用摄像头对应的Open相关API来对摄像头进行打开操作。然而,系统自带的Open相关API仅在摄像头未被占用的情况下能够实现摄像头的开启操作,在摄像头已经被一个应用程序占用时,当另一个应用程序试图通过Open相关API实现开启摄像头的操作,会自动返回一个错误信息。因此现有设备中两个以上的应用程序不能同时获取摄像头的数据进行使用。

类似地,使用摄像头的应用程序通过调用Cameral类的关(Close)函数关闭摄像头,即通过调用摄像头对应的关相关API来对摄像头进行关闭操作。

本发明的摄像头数据分发方法首先对摄像头对应的开、关相关API进行封装,禁止摄像头所在设备中的应用程序直接调用。也即,使应用程序无法通过系统自带的Camera类的Open函数来打开摄像头,也无法通过Camera类的Close函数来关闭摄像头。

在本实施例中,可以仅禁止摄像头所在设备中有可能使用摄像头的应用程序直接调用摄像头对应的开、关相关API。

2)在所述摄像头处分别注册应用程序各自对应的监听接口。

在摄像头处注册应用程序的监听接口,即是使该监听接口作为事件监听者,来实现对于该应用程序使用摄像头事件的监听。当监听到事件发生,即有应用程序请求与摄像头连接,系统则通知与该应用程序对应人监听接口来处理相应的事件。

在本实施例中,可以仅注册摄像头所在设备中有可能使用摄像头的应用程序对应的监听接口。

3)对所述监听接口进行封装,以供各应用程序分别进行调用。

对在摄像头处注册后对的监听接口进行封装实质上是对摄像头初始化的过程,在该初始化过程中对各个接口进行声明、资源分配等等,以供各应用程序分别进行调用。

如果某个监听接口未被封装,则对应的应用程序无法调用摄像头

4)目标应用程序请求与摄像头连接时,通过所述目标应用程序对应的监听接口分别将所述摄像头与对应的目标应用程序进行连接。

当事件监听者监听到目标应用程序请求与摄像头连接的事件,则系统调用与该目标程序对应的监听接口来处理该事件,也即通过与该目标程序对应的监听接口来摄像头与对应的目标应用程序进行连接。

当有多个目标程序请求与摄像头进行连接,则通过与所述多个目标程序对应的监听接口分别将摄像头与多个目标应用程序进行连接。

可见,在禁止应用程序调用系统原有的摄像头所对应的开、关相关API,而改用本发明中在摄像头处注册应用程序对应的监听接口,即可以实现多个目标应用程序与摄像头的同时连接。

5)在所述目标应用程序与所述摄像头连接成功之后,进行摄像头与目标应用程序之间的数据实时分发。

当所述目标应用程序与所述摄像头连接成功之后,将摄像头采集的视频数据分别逐帧发送给所述目标应用程序。

具体地,在摄像头的内部缓存待发送的图像帧,并在实时发送给各目标应用程序的同时,缓存所述图像帧的下一帧,直至摄像头关闭。

由于多个目标应用程序可以同时与摄像头进行连接,因而摄像头的数据可以同时分发给所有与其连接成功的目标应用程序,使得多个目标应用程序可以同时摄像头的图像数据进行处理,从而实现了摄像头资源的使用不限制应用程序个数的效果。

在示例性实施例中,通过setPreviewCallbackWithBuffer方式回调接口获取摄像头的视频数据。

在示例性实施例中,摄像头的视频数据原始为YUV NV21格式。

Android系统提供了两种方式回调接口来获取摄像头的原始数据。

第一种为setPreviewCallback方式,设置回调接口PreviewCallback,在回调方法onPreviewFrame()中处理每一帧数据;

第二种为setPreviewCallbackWithBuffer方式,同样设置回调接口PreviewCallback,与addCallbackBuffer方式配合使用。

第二种方式和第一种方式区别在于:第一种方式是onPreviewFrame回调方法,会在每一帧数据准备好了就调用,但是第二种方式是在需要在前一帧的onPreviewFrame方法中调用addCallbackBuffer方法,下一帧的onPreviewFrame才会调用,同时addCallbackBuffer方法的参数的byte数据就是每一帧的原数据。也就是说第一种方法的onPreviewFrame调用是不可控制的,就是每一帧数据准备好了就回调,但是第二种方法是可控的,通过addCallbackBuffer的调用来控制onPreviewFrame的回调机制。

此外,setPreviewCallbackWithBuffer方式与setPreviewCallback方式相比,每产生一帧都要开辟一个新的buffer进行存储帧数据,这样不断开辟和回收内存,GC回收频繁,效率很低。

而在本发明中,摄像头在被开启后,就开始将采集的视频数据在内部进行缓存然后释放这样的过程。当至少一个目标应用程序与摄像头连接成功后,发送给应用程序的实质上是缓存在摄像头内部的数据。通过这种方式降低了GC回收频率,提高了数据访问效率。

6)当全部目标应用程序都退出与所述摄像头的连接,则将所述摄像头关闭。

当监听到目标应用有程序请求退出与所述摄像头的连接这样的事件发生,则系统通知与所述目标应用程序对应的监听接口来处理相应的事件,即通过与所述目标应用程序对应的监听接口通开其与所述摄像头的连接。

当全部目标应用程序都退出与所述摄像头的连接,则关闭摄像头,释放资源。

在示例性实施例中,当目标应用程序请求与摄像头连接时,如果所述摄像头处于关闭的状态,则首先将所述摄像头打开。

在摄像头处于关闭状态时,当第一次监听到目标应用程序请求与摄像头连接的事件发生,则通过与所述目标应用程序所对应的监听接口将所述摄像头打开。当摄像头处于开启状态时,再监听到其他目标应用程序请求与摄像头连接的事件发生,则可以直接通过与这些目标应用程序对应的监听接口分别将这些目标应用程序与摄像头连接,以使这些应用程序能够获取摄像头采集的视频数据。

在示例性实施例中,当所述目标应用程序与所述摄像头连接成功,则摄像头引用计数加1;当目标应用程序退出与所述摄像头的连接,则摄像头引用计数减1。

具体地,当有应用程序A请求与摄像头连接,如果此时摄像头是关闭的,没有被任何应用程序占用,则通过与应用程序A对应的监听接口将摄像头打开,将原本为0的引用计数加1;此时若再有应用程序B请求与摄像头连接时,由于此时摄像头已经打开,无需再进行摄像头打开的步骤直接通过与应用程序B对应的监听接口将应用程序B与摄像头连接即可,并将引用计数加1。即每有一个应用程序与摄像头连接成功,引用计数则加1。引用计数的数目表明当前有几个应用程序正同时与摄像头连接。当应用程序A退出与摄像头的连接,不再使用摄像头,则摄像头的引用计数减1;当应用程序B也退出与摄像头的连接,引用计数再减1。即每有一个应用程序退出与摄像头的连接,引用计数则减1。

在示例性实施例中,当所述摄像头引用计数为0,将所述摄像头关闭。

每有一个应用程序退出与摄像头的连接,引用计数则减1,直到引用计数为0,说明没有应用程序在使用摄像头,则最终关闭摄像头,释放资源。

在实例性实施例中,通过外部控制period将摄像头内部缓存的数据调取至客户端。

摄像头内部缓存的数据通过外部Period直接调取,外部添加回调的方式,将数据提供给客户端使用。

本发明的另一实施例提出了一种用于摄像头数据分发的装置。

该装置可以包括:用于对摄像头对应的开、关相关API进行封装的单元,以禁止摄像头所在设备中的应用程序直接调用;用于在所述摄像头处分别注册应用程序各自对应的监听接口的单元;用于对所述监听接口进行封装的单元,以将所述监听接口供各应用程序分别进行调用;用于在目标应用程序请求与摄像头连接时,通过所述目标应用程序对应的监听接口分别将所述摄像头与对应的目标应用程序进行连接的单元;用于在所述目标应用程序与所述摄像头连接成功之后,进行摄像头与目标应用程序之间的数据实时分发的单元;用于当全部目标应用程序都退出与所述摄像头的连接,则将所述摄像头关闭的单元。

在实例性实施例中,当所述目标应用程序与所述摄像头连接成功之后,将摄像头采集的视频数据分别逐帧发送给所述目标应用程序。

在实例性实施例中,当所述目标应用程序与所述摄像头连接成功之后,在摄像头的内部缓存待发送的图像帧,并在实时发送给各目标应用程序的同时,缓存所述图像帧的下一帧,直至摄像头关闭。

在实例性实施例中,当所述目标应用程序与所述摄像头连接成功,则摄像头引用计数加1;当目标应用程序退出与所述摄像头的连接,则摄像头引用计数减1。

在实例性实施例中,当所述摄像头引用计数为0,将所述摄像头关闭。

本实施例的摄像头数据分发方法,有效地解决了多个应用程序不能同时使用摄像头的问题,每个应用程序都可以并行地得到原始数据并处理自身的业务逻辑,而不是采用原本的摄像头串行操作,大大扩展了摄像头的使用场景跟使用效率,不存在某些应用服务可以得到数据,某些应用服务无响应的情况。并且统一摄像头的开启、关闭操作,与传统摄像头调用相比,大大减少了开启,关闭摄像头的次数,减少由于频繁开启关闭而引起的各种异常。并且本实施例的摄像头数据分发方法采用内部nv21数据源缓存机制,用完数据后由客户端放回数据源,再加上发明自身的缓存机制,大大提高了客户端使用原始数据的效率跟内存,CPU处理效率,大大降低了GC回收的频率。

在上述步骤中,整个数据提供为一个单独的服务,即可以支持多个线程、多个应用服务、多个进程同时访问。

应用示例

为便于理解本发明实施例的方案及其效果,以下给出一个具体应用示例。本领域技术人员应理解,该示例仅为了便于理解本发明,其任何具体细节并非意在以任何方式限制本发明。

以下示例为使用本发明的用于摄像头数据分发的方法将摄像头的视频数据同时发送给三个应用程序:运动检测程序、面部追踪程序、视频通话程序的具体步骤。

首先,对摄像头对应的开、关相关API进行封装,禁止摄像头所在设备中的所有可能使用摄像头的应用程序直接调用。

在该摄像头处分别注册与运动检测程序、面部追踪程序、视频通话程序相对应的监听接口,用于监听这三个程序请求与摄像头进行连接的请求。

对三个应用程序相对应的监听接口进行封装,即对这三个监听接口进行声明,进行资源分配,以供三个应用程序分别对其进行调用。

在摄像头处于关闭状态的情况下,当首次监听到需要使用摄像头来捕捉对象运动的运动检测程序请求与摄像头进行连接的事件时,通过与运动检测程序对应的监听接口将摄像头打开,将运动监测程序与摄像头进行连接,并在连接成功后将原本为0的摄像头引用计数加1。当运动监测程序与摄像头连接成功,摄像头将在其内部进行缓存的视频数据通过其监听接口逐帧发送给运动监测程序,运动监测程序可以对所述视频数据进行处理以进行运动监测。

在摄像头已经打开,引用计数为1的情况下,当监听到同样需要摄像头来捕捉对像的面部图像的面部追踪程序请求与摄像头连接的事件,则通过与面部追踪程序相对应的监听接口将面部追踪程序与摄像头进行连接,在连接成功后将摄像头的引用计数加1,并将摄像头内部缓存的视频数据通过其监听接口逐帧发送给该应用程序以供其处理和使用。同理,如果此时监听到视频通话程序也请求与摄像头连接的事件,则通过与视频通话程序相对应的监听接口将视频通话程序与摄像头进行连接,在连接后再将引用计数加1。此时摄像头的引用计数为3,表明同时有3个应用程序与摄像头连接。在视频通话程序与摄像头连接成功话,同样也将摄像头内部缓存的视频数据通过其监听接口分别逐帧发送给这三个应用程序,如调用内部缓存,将视频数据中的第1帧缓存后分别实时发送给运动检测程序、面部追踪程序、视频通话程序,同时缓存第2帧,再分别实时发送给运动检测程序、面部追踪程序、视频通话程序,以此类推,直至某个应用程序退出或者摄像头关闭。

当这三个应用程序中有一个请求退出与摄像头的连接,则通过与该应用程序对应的监听接口断开其与摄像头的加接,同时将摄像头引用计将摄像头关闭,并将内部、外部缓存的数据全部清掉,恢复摄像头初始化状态,再次等待应用程序来调用。

本领域技术人员应理解,上面对本发明的实施例的描述的目的仅为了示例性地说明本发明的实施例的有益效果,并不意在将本发明的实施例限制于所给出的任何示例。

本发明可以是装置、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。

这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1