一种摄像头调用方法和装置与流程

文档序号:13363500阅读:350来源:国知局

本发明涉及计算机技术领域,具体涉及一种摄像头调用方法和装置。



背景技术:

通过网络通信,可以实现摄像头的远程调用(或者说是异机调用),也就是实现在远程设备上调用本地设备中的摄像头(反之亦然)。这种技术也可称之为摄像头重定向。但是当设备上的摄像头数量较多时,另一设备往往只能同时调用其中的部分摄像头,无法满足用户的需求。



技术实现要素:

鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的摄像头调用方法和装置。

根据本发明的一个方面,提供了一种摄像头调用方法,应用于调用第二计算设备上的摄像头的第一计算设备上,包括:

获取所述第二计算设备上的一个或多个摄像头的显示名称;

为所述第一计算设备中的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存;

在接收到所述第一计算设备上的应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在所述应用程序中实例化一个或多个摄像头插件对象,以使所述应用程序根据各摄像头插件对象调用相应的摄像头。

可选地,所述获取所述第二计算设备上的一个或多个摄像头的显示名称包括:

向所述第二计算设备中的摄像头管理插件发送显示名称获取请求,接收所述摄像头管理插件返回的摄像头的显示名称;

其中,所述远程设备上接入的摄像头有一个或多个,各摄像头分别对应一个显示名称,所述远程设备中的摄像头插件在每有一个摄像头接入到所述远程设备时,获取该接入的摄像头的显示名称。

可选地,所述将各所述摄像头的显示名称与各摄像头插件实例标识对应保存包括:

生成一个数据结构体,在所述数据结构体中对应保存各所述摄像头的显示名称和各摄像头插件实例标识;

所述根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在所述应用程序中实例化一个或多个摄像头插件对象包括:

在接收到获取摄像头的显示名称和/或所述摄像头插件实例标识的指令时,将所述数据结构体中相应的信息作为该获取指令的返回结果。

可选地,所述摄像头插件为流媒体处理框架directshow中的源滤镜;

所述获取摄像头的显示名称和/或所述摄像头插件实例标识的指令是通过所述directshow中执行源滤镜实例化的相关函数发出的;

其中,所述执行源滤镜实例化的相关函数被修改为在需要获取摄像头的显示名称和/或所述摄像头插件实例标识时,由插入的预设函数发出获取摄像头的显示名称和/或所述摄像头插件实例标识的指令;和/或,所述执行源滤镜实例化的相关函数被修改为在获取摄像头的显示名称和/或所述摄像头插件实例标识时,将该函数原本执行的获取摄像头的显示名称和/或所述摄像头插件实例标识的指令指向所述数据结构体。

可选地,所述第一计算设备是虚拟桌面基础架构vdi中的服务器上部署的虚拟机,所述第二计算设备是所述vdi中的客户端;该方法还包括:

响应于所述客户端发送的终止指令,删除对应保存的各摄像头的显示名称与各摄像头插件实例标识。

依据本发明的另一方面,提供了一种摄像头调用装置,设置于调用第二计算设备上的摄像头的第一计算设备上,包括:

摄像头显示名称获取单元,用于获取所述第二计算设备上的一个或多个摄像头的显示名称;

摄像头插件实例管理单元,用于为所述第一计算设备中的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存;

实例化辅助单元,用于在接收到所述第一计算设备上的应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在所述应用程序中实例化一个或多个摄像头插件对象,以使所述应用程序根据各摄像头插件对象调用相应的摄像头。

可选地,所述摄像头显示名称获取单元,用于向所述第二计算设备中的摄像头管理插件发送显示名称获取请求,接收所述摄像头管理插件返回的摄像头的显示名称;

其中,所述远程设备上接入的摄像头有一个或多个,各摄像头分别对应一个显示名称,所述远程设备中的摄像头插件在每有一个摄像头接入到所述远程设备时,获取该接入的摄像头的显示名称。

可选地,所述摄像头插件实例管理单元,用于生成一个数据结构体,在所述数据结构体中对应保存各所述摄像头的显示名称和各摄像头插件实例标识;

所述实例化辅助单元,用于在接收到获取摄像头的显示名称和/或所述摄像头插件实例标识的指令时,将所述数据结构体中相应的信息作为该获取指令的返回结果。

可选地,所述摄像头插件为流媒体处理框架directshow中的源滤镜;

所述获取摄像头的显示名称和/或所述摄像头插件实例标识的指令是通过所述directshow中执行源滤镜实例化的相关函数发出的;

其中,所述执行源滤镜实例化的相关函数被修改为在需要获取摄像头的显示名称和/或所述摄像头插件实例标识时,由插入的预设函数发出获取摄像头的显示名称和/或所述摄像头插件实例标识的指令;和/或,所述执行源滤镜实例化的相关函数被修改为在获取摄像头的显示名称和/或所述摄像头插件实例标识时,将该函数原本执行的获取摄像头的显示名称和/或所述摄像头插件实例标识的指令指向所述数据结构体。

可选地,所述第一计算设备是虚拟桌面基础架构vdi中的服务器上部署的虚拟机,所述第二计算设备是所述vdi中的客户端;

所述摄像头插件实例管理单元,还用于响应于所述客户端发送的启动指令删除对应保存的各摄像头的显示名称与各摄像头插件实例标识。

由上述可知,本发明的技术方案,在第一计算设备上获取第二计算设备上的至少一个摄像头的显示名称,并为本地的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存,从而在接收到本地应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在应用程序中实例化一个或多个摄像头插件对象,以使所述应用程序根据各摄像头插件对象调用相应的摄像头。该技术方案通过摄像头插件实例标识的动态生成,使得任意数量的异机摄像头可以被一个本机摄像头插件的多个实例分别支持,即实现了在应用程序中加载任意数量的摄像头,从而使应用程序能够实现对多个异机摄像头的同时调用。

附图说明

图1示出了摄像头重定向的原理示意图;

图2示出了根据本发明一个实施例的一种摄像头调用方法的流程示意图;

图3示出了根据本发明一个实施例的在vdi中应用摄像头调用方法的示意图;

图4示出了根据本发明一个实施例的一种摄像头调用装置的结构示意图;

图5示出了根据本发明一个实施例的一种网络设备硬件的结构示意图。

具体实施方式

为了解决背景技术中提出的技术问题,本申请的发明人经过分析发现:远程设备上可调用的摄像头数量是有限的,通常是一个固定值,其原因是摄像头作为硬件,其采集的数据往往需要通过流媒体处理框架中的摄像头插件进行处理,因而需要将摄像头与摄像头插件中预先写入的摄像头插件的实例标识进行绑定注册,使得摄像头在被调用时,可以根据其绑定的摄像头插件的实例标识来完成摄像头插件的实例化,通过实例化后的摄像头实例对象接收并传递摄像头采集的视频数据。这种利用已注册的绑定关系完成摄像头插件实例化的方式可以称之为摄像头插件的静态加载。

而由于摄像头插件中预先写入的实例标识的数量是固定的,因此通常一个摄像头插件只能同时支持一个或几个摄像头,,最多可同时调用的摄像头的数量就受到了摄像头插件数量和摄像头插件中预先写入的实例标识的数量的限制。例如,当摄像头插件数量为1,摄像头插件中预先写入的实例标识的数量是m,摄像头的数量超过m(例如为n)时,由于一个摄像头要使用一个摄像头插件实例对象,只能同时调用m个摄像头,而无法对剩余的n-m个摄像头进行有效的利用。

因此本申请的发明人想到,如果改变这种在一个摄像头插件中写入固定数量的实例标识的方式,在加载摄像头插件时为其动态地生成一个实例标识,这样从理论上讲就可以生成任意数量的摄像头插件实例对象,从而调用任意数量的摄像头了。

为此,本申请示例公开了一种摄像头调用方法和装置,以解决现有技术中摄像头重定向的数量受限的问题。为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。

在本发明使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本发明可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本发明范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

在此首先对摄像头重定向的场景做一个描述。摄像头重定向依托于directshow框架,这是微软公司提供的一种用于流媒体处理的开发框架,应用程序的开发者可以基于该开发框架开发流媒体处理相关的应用程序,例如支持摄像头调用功能的程序。directshow使用滤镜组(filtergraph)来管理数据流的处理过程,其包含三类filter:源滤镜(sourcefilter)、转换滤镜(transformfilter)和显示滤镜(renderfilter)。如图1所示,当本地计算设备上的摄像头被远程计算设备调用时,在本地计算设备和远程计算设备中都会构建一个filtergraph,在本地计算设备filtergraph中,当采集到的视频数据流走到renderfilter时,不在本地播放,而是将数据通过网络传输到远程计算设备中,通过在远程技术设备中构建的filtergraph来播放视频数据。视频数据流的流向如图1所示,在此不需要赘述。

图2示出了根据本发明一个实施例的一种摄像头调用方法的流程示意图,其中,该方法应用于调用第二计算设备上的摄像头的第一计算设备上,第一计算设备也可称为本地计算设备,既可以是物理设备,也可以是虚拟设备,第二计算设备也可称为远程计算设备。如图2所示,该方法包括:

步骤s210,获取第二计算设备上的一个或多个摄像头的显示名称。

摄像头的显示名称也叫友好名称,是摄像头硬件显示给用户的名字,也会在摄像头插件的实例化过程中被使用。摄像头插件的实例化是指,应用程序在调用摄像头插件时,会将摄像头插件实例化为一个可以被调用的实例化对象。

步骤s220,为第一计算设备中的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存。

摄像头插件实例标识也叫摄像头插件实例id(identification,身份证明),现有技术中插件中会写入一个或多个guid(globallyuniqueidentifier,全局唯一标识符)作为摄像头插件实例id。但在本实施例中,并不预先在插件中写好若干guid,而是动态地创建一个guid作为摄像头插件实例id。由于摄像头插件实例id是动态生成的,也就无法预先实现与摄像头的绑定。因此在生成摄像头插件实例id后,还需要进行一次绑定注册,也就是将摄像头的显示名称与摄像头插件实例标识对应保存。这种对应关系就确定了摄像头对应的摄像头插件实例,通过相应的摄像头插件实例获取摄像头采集的视频数据。当摄像头有多个时,自然也就生成摄像头插件实例id,分别进行注册。

步骤s230,在接收到第一计算设备上的应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在应用程序中实例化一个或多个摄像头插件对象,以使应用程序根据各摄像头插件对象调用相应的摄像头。

在摄像头插件实例化的过程中,需要多次用到摄像头的显示名称和摄像头插件实例标识,最终确定摄像头插件的入口点。现有技术中由于摄像头的显示名称与摄像头插件实例标识的对应关系是预先保存的,在用到这些参数时需要到预定的数据结构中查询。而在本实施例中将摄像头的显示名称与摄像头插件实例标识对应保存到了其他位置,因此需要根据保存的信息而非预定的数据结构中的信息来完成摄像头插件的实例化。

可见,图2所示的方法,在第一计算设备上获取第二计算设备上的至少一个摄像头的显示名称,并为本地的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存,从而在接收到本地应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在应用程序中实例化一个或多个摄像头插件对象,以使应用程序根据各摄像头插件对象调用相应的摄像头。该技术方案通过摄像头插件实例标识的动态生成,使得任意数量的异机摄像头可以被一个本机摄像头插件的多个实例分别支持,即实现了在应用程序中加载任意数量的摄像头,从而使应用程序能够实现对多个异机摄像头的同时调用。

由于上面的方法应用在本地计算设备,而摄像头是设置在远程计算设备上的,因此在本发明的一个实施例中,上述方法中,获取第二计算设备上的一个或多个摄像头的显示名称包括:向第二计算设备中的摄像头管理插件发送显示名称获取请求,接收摄像头管理插件返回的摄像头的显示名称;其中,远程设备上接入的摄像头有一个或多个,各摄像头分别对应一个显示名称,远程设备中的摄像头插件在每有一个摄像头接入到远程设备时,获取该接入的摄像头的显示名称。

远程设备中的摄像头管理插件可以表现为一个摄像头服务进程,而上述实施例中的摄像头调用方法同样可以以一个摄像头服务服务进程来实现。如图3所示,当有摄像头硬件接入到远程计算设备中时,远程计算设备中的摄像头服务进程就会感知到,并获取其显示名称并发送给本地计算设备中的摄像头服务进程。

前面的实施例中还提到,现有技术中由于摄像头的显示名称与摄像头插件实例标识的对应关系是预先保存的,在用到这些参数时需要到预定的数据结构中查询,而在本实施例中,如果依然去预定的数据结构中查询,那么无法得到正确的信息。因此在本发明的一个实施例中,上述方法中,将各摄像头的显示名称与各摄像头插件实例标识对应保存包括:生成一个数据结构体,在数据结构体中对应保存各摄像头的显示名称和各摄像头插件实例标识;根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在应用程序中实例化一个或多个摄像头插件对象包括:在接收到获取摄像头的显示名称和/或摄像头插件实例标识的指令时,将数据结构体中相应的信息作为该获取指令的返回结果。

该数据结构体可以参照上述中的预定的数据结构进行设计,这样在摄像头插件实例化的过程中,需要用到摄像头的显示名称和/或摄像头插件实例标识时,可以在不大幅修改原函数或方法的情况下直接获取到数据结构体中相应的信息。其具体的实现方法可以是:在本发明的一个实施例中,上述方法中,摄像头插件为流媒体处理框架directshow中的源滤镜;获取摄像头的显示名称和/或摄像头插件实例标识的指令是通过directshow中执行源滤镜实例化的相关函数发出的;其中,执行源滤镜实例化的相关函数被修改为在需要获取摄像头的显示名称和/或摄像头插件实例标识时,由插入的预设函数发出获取摄像头的显示名称和/或摄像头插件实例标识的指令;和/或,执行源滤镜实例化的相关函数被修改为在获取摄像头的显示名称和/或摄像头插件实例标识时,将该函数原本执行的获取摄像头的显示名称和/或摄像头插件实例标识的指令指向数据结构体。

使用directshow开发的应用程序会主动调用directshow中的相关函数来完成源滤镜实例化,这些被调用的函数在本实施例中称之为源滤镜实例化的相关函数。这些函数会访问directshow框架中用于保存摄像头插件实例id与对应的摄像头的显示名称的全局变量cfactorytemplate,从中读取摄像头的显示名称和/或摄像头插件实例标识。该全局变量表现为一个结构体数组,摄像头插件实例id保存在其中的clsid_somefilter项中,摄像头插件的入口点为其中的csomefilter::createinstance项。而在本实施例中,如果这些函数直接读取cfactorytemplate是无法得到所需的数据的。在本实施例中给出了两种示例,通过对源滤镜实例化的相关函数进行预先修改而实现。具体地,一种情形下,通过在directshow框架中插入预设函数,使得源滤镜实例化的相关函数在执行前,有预设函数主动向本地计算设备中的摄像头服务进程获取需要的信息,摄像头服务进程利用sockets(套接字)直接返回相应信息;另一种情形下,使用hook(钩子)技术,将这些源滤镜实例化的相关函数原本执行的获取摄像头的显示名称和/或摄像头插件实例标识的指令指向数据结构体。当然,在具体实现时也不限于上面给出的两种实现方法。

也就是说,通过对directshow中的函数和一些相应的调用接口进行修改等方式,这样一方面应用程序不需要做任何的改进,依然执行其内部调用directshow的逻辑即可;另一方面,应用程序访问的directshow的接口、调用的函数可以是修改过的,这样还保证了在摄像头插件实例化的过程中可以根据正确的摄像头的显示名称和摄像头插件实例标识的对应关系,保证实例化的稳定性。

上述各实施例中的应用程序可以是专门的摄像头软件,或者是具有摄像头调用功能的其他应用程序,例如直播软件等。

在本发明的一个实施例中,上述方法中,第一计算设备是虚拟桌面基础架构vdi中的服务器上部署的虚拟机,第二计算设备是vdi中的客户端;该方法还包括:响应于客户端发送的启动指令,删除对应保存的各摄像头的显示名称与各摄像头插件实例标识。

可以参照图3,在vdi(virtualdesktopinfrastructure,虚拟桌面基础架构)中的客户端中设置控制程序(例如随客户端启动而运行),在客户端和虚拟机中分别部署一个摄像头服务进程,其中,虚拟机上的摄像头服务进程在与客户端中的摄像头服务进程配合下执行上述实施例中的摄像头调用方法,客户端中的摄像头服务进程可以启动一个执行程序,来构建客户端中的filtergraph;虚拟机上的摄像头服务进程在完成摄像头插件的实例化后,由加载到应用程序中的摄像头插件进程构建虚拟机中的filtergraph,这两个filtergraph之间的数据流图可以参照图1。其中,控制程序可以控制两个摄像头服务进程的启动或停止,当控制虚拟机上的摄像头服务进程停止时,虚拟机上的摄像头服务进程还会删除对应保存的各摄像头的显示名称与各摄像头插件实例标识。vdi使用户可以采用轻量的客户端连接到虚拟机,从而实现虚拟桌面的远程访问,客户端的拓展性强,可以接入多个摄像头。

图4示出了根据本发明一个实施例的一种摄像头调用装置的结构示意图,该装置设置于调用第二计算设备上的摄像头的第一计算设备上,如图4所示,摄像头调用装置400包括:

摄像头显示名称获取单元410,用于获取第二计算设备上的一个或多个摄像头的显示名称。

摄像头插件实例管理单元420,用于为第一计算设备中的摄像头插件生成与各摄像头对应的摄像头插件实例标识,将各摄像头的显示名称与各摄像头插件实例标识对应保存。

实例化辅助单元430,用于在接收到第一计算设备上的应用程序的摄像头插件实例化请求时,根据对应保存的各摄像头的显示名称与各摄像头插件实例标识,在应用程序中实例化一个或多个摄像头插件对象,以使应用程序根据各摄像头插件对象调用相应的摄像头。

可见,图4所示的装置,通过摄像头插件实例标识的动态生成,使得任意数量的异机摄像头可以被一个本机摄像头插件的多个实例分别支持,即实现了在应用程序中加载任意数量的摄像头,从而使应用程序能够实现对多个异机摄像头的同时调用。

在本发明的一个实施例中,上述装置中,摄像头显示名称获取单元410,用于向第二计算设备中的摄像头管理插件发送显示名称获取请求,接收摄像头管理插件返回的摄像头的显示名称;其中,远程设备上接入的摄像头有一个或多个,各摄像头分别对应一个显示名称,远程设备中的摄像头插件在每有一个摄像头接入到远程设备时,获取该接入的摄像头的显示名称。

在本发明的一个实施例中,上述装置中,摄像头插件实例管理单元420,用于生成一个数据结构体,在数据结构体中对应保存各摄像头的显示名称和各摄像头插件实例标识;实例化辅助单元430,用于在接收到获取摄像头的显示名称和/或摄像头插件实例标识的指令时,将数据结构体中相应的信息作为该获取指令的返回结果。

在本发明的一个实施例中,上述装置中,摄像头插件为流媒体处理框架directshow中的源滤镜;获取摄像头的显示名称和/或摄像头插件实例标识的指令是通过directshow中执行源滤镜实例化的相关函数发出的;其中,执行源滤镜实例化的相关函数被修改为在需要获取摄像头的显示名称和/或摄像头插件实例标识时,由插入的预设函数发出获取摄像头的显示名称和/或摄像头插件实例标识的指令;和/或,执行源滤镜实例化的相关函数被修改为在获取摄像头的显示名称和/或摄像头插件实例标识时,将该函数原本执行的获取摄像头的显示名称和/或摄像头插件实例标识的指令指向数据结构体。

在本发明的一个实施例中,上述装置中,第一计算设备是虚拟桌面基础架构vdi中的服务器上部署的虚拟机,第二计算设备是vdi中的客户端;插件实例管理单元420,还用于响应于客户端发送的启动指令,删除对应保存的各摄像头的显示名称与各摄像头插件实例标识。

本发明提供的摄像头调用装置可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,可通过处理器510将非易失性存储器550中与摄像头调用装置400对应的机器可执行指令读取到易失性存储器540中运行。

从硬件层面而言,如图5所示,为本发明一个实施例的一种网络设备硬件的结构示意图,除了图3所示的处理器510、内部总线520、网络接口530、易失性存储器540、以及非易失性存储器550之外,根据该网络设备的实际功能,还可以包括其他硬件,对此不再赘述。

在不同的实施例中,非易失性存储器550可以是:存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。易失性存储器540可以是:ram(radomaccessmemory,随机存取存储器)。

进一步,非易失性存储器550和易失性存储器540作为机器可读存储介质,其上可存储由处理器510执行的摄像头调用装置400对应的机器可执行指令。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

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