发明内容
本发明的实施例提供一种切换拍摄模式方法和电子设备,在一个Activity内部实现拍照模式、摄像模式及两种拍摄模式之间的切换,且在切换过程中保持用户界面对实时影像的预览,消除电子设备在两种模式之间进行切换时产生的延时或中断,避免对预览画面进行不必要的调整。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明实施例提供一种切换拍摄模式方法,应用于一种电子设备,所述方法包括:
连续采集获取目标图像的多个视频帧,并将所述多个视频帧依次存储在预设数据缓存中,所述目标图像为预设取景范围内的可视影像;
从所述预设数据缓存中依次读取所述多个视频帧,并依次将所述多个视频帧输出到用户界面,以实时显示预览所述目标图像;
接收切换指令,在当前活动Activity内部进行拍摄模式切换,并在所述拍摄模式切换过程中保持输出从所述预设数据缓存中读取的视频帧到所述用户界面,以实时显示预览所述目标图像。
结合第一方面,在第一种可能的实现方式中,所述连续采集获取目标图像的多个视频帧,并将所述多个视频帧依次存储在预设数据缓存中包括:
申请创建所述预设数据缓存,并将所述预设数据缓存映射到内存空间中;
将获得的所述多个视频帧依次存储在所述预设数据缓存中队列的队尾,所述队列为所述预设数据缓存中以队列结构管理的存储单元集合。
结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述从所述预设数据缓存中依次读取所述多个视频帧,并依次将所述多个视频帧输出到用户界面,以实时显示预览所述目标图像包括:
创建预览线程,所述预览线程包括从所述预设数据缓存中队列的队首位置读取视频帧,并将所述视频帧输出到所述用户界面;
循环调用所述预览线程,在所述用户界面上实时显示预览所述目标图像。
结合第一方面的第二种可能的实现方式,在第三种可能的实现方式中,所述接收切换指令,在当前活动Activity内部进行拍摄模式切换,并在所述拍摄模式切换过程中保持输出从所述预设数据缓存中读取的视频帧到所述用户界面,以实时显示预览所述目标图像包括:
若从拍照模式切换为摄像模式,则在当前Activity内部关闭拍照线程,并调用摄像线程;或,若从摄像模式切换为拍照模式,则在当前Activity内部关闭摄像线程,并调用拍照线程;在切换过程中,保持循环调用所述预览线程,在所述用户界面上实时显示预览所述目标图像;
所述拍照线程包括在接收拍照指令后,从所述预设数据缓存中提取单个目标视频帧,并进行编码压缩处理得到图像文件;所述摄像线程包括在接收摄像指令后,对所述目标图像进行采集获取连续目标视频帧,并对所述连续目标视频帧进行编码压缩处理得到视频文件。
结合第一方面,在第四种可能的实现方式中,在所述连续采集获取目标图像的多个视频帧之前,还包括:
检测摄像头模块是否存在,并在检测确定存在后,请求对所述摄像头模块进行访问。
第二方面,提供一种电子设备,所述电子设备包括:
采集存储单元,用于连续采集获取目标图像的多个视频帧,并将所述多个视频帧依次存储在预设数据缓存中,所述目标图像为预设取景范围内的可视影像;
显示预览单元,用于从所述预设数据缓存中依次读取所述多个视频帧,并依次将所述多个视频帧输出到用户界面,以实时显示预览所述目标图像;
模式切换单元,用于接收切换指令,在当前活动Activity内部进行拍摄模式切换,并在所述拍摄模式切换过程中保持输出从所述预设数据缓存中读取的视频帧到所述用户界面,以实时显示预览所述目标图像。
结合第二方面,在第一种可能的实现方式中,所述采集存储单元具体用于:
申请创建所述预设数据缓存,并将所述预设数据缓存映射到内存空间中;
将获得的所述多个视频帧依次存储在所述预设数据缓存中队列的队尾,所述队列为所述预设数据缓存中以队列结构管理的存储单元集合。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述显示预览单元具体用于:
创建预览线程,所述预览线程包括从所述预设数据缓存中队列的队首位置读取视频帧,并将所述视频帧输出到所述用户界面;
循环调用所述预览线程,在所述用户界面上实时显示预览所述目标图像。
结合第二方面的第二种可能的实现方式,在第三种可能的实现方式中,所述模式切换单元具体用于:
若从拍照模式切换为摄像模式,则在当前Activity内部关闭拍照线程,并调用摄像线程;或,若从摄像模式切换为拍照模式,则在当前Activity内部关闭摄像线程,并调用拍照线程;在切换过程中,保持循环调用所述预览线程,在所述用户界面上实时显示预览所述目标图像;
所述拍照线程包括在接收拍照指令后,从所述预设数据缓存中提取单个目标视频帧,并进行编码压缩处理得到图像文件;所述摄像线程包括在接收摄像指令后,对所述目标图像进行采集获取连续目标视频帧,并对所述连续目标视频帧进行编码压缩处理得到视频文件。
结合第二方面,在第四种可能的实现方式中,所述电子设备还包括:
检测访问单元,用于检测摄像头模块是否存在,并在检测确定存在后,请求对所述摄像头模块进行访问。
本发明的实施例提供一种切换拍摄模式方法和电子设备,将获取的实时目标图像的视频帧依次存储在预设数据缓存中,通过从预设数据缓存中依次读取视频帧,在用户界面上实时显示预览目标图像,并在一个Activity内部调整资源完成拍摄模式的切换,且在切换过程中保持用户界面对实时影像的预览。这样,消除了在两种拍摄模式之间进行切换时产生的延时或中断,避免了对预览画面进行不必要的调整。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施例提供一种切换拍摄模式方法,如图1所示,该方法包括:
S101、连续采集获取目标图像的多个视频帧,并将多个视频帧依次存储在预设数据缓存中,目标图像为预设取景范围内的可视影像;
S102、从预设数据缓存中依次读取多个视频帧,并依次将多个视频帧输出到用户界面,以实时显示预览目标图像;
S103、接收切换指令,在当前活动Activity内部进行拍摄模式切换,并在拍摄模式切换过程中保持输出从预设数据缓存中读取的视频帧到用户界面,以实时显示预览目标图像。
本发明的实施例提供一种切换拍摄模式方法,将获取的实时目标图像的视频帧依次存储在预设数据缓存中,通过从预设数据缓存中依次读取视频帧,在用户界面上实时显示预览目标图像,并在一个Activity内部调整资源完成拍摄模式的切换,且在切换过程中保持用户界面对实时影像的预览。这样,消除了在两种拍摄模式之间进行切换时产生的延时或中断,避免了对预览画面进行不必要的调整。
为了使本领域技术人员能够更清楚地理解本发明实施例提供的技术方案,下面通过具体的实施例,对本发明实施例提供的另一种切换拍摄模式方法进行详细说明,如图2所示,该方法包括:
S201、检测并访问摄像头模块。
具体的,在对目标图像进行采集之前,需要对电子设备的摄像头模块是否可用进行检测。
示例性的,电子设备检测是否能连接到一个存在的摄像头模块,其中,该摄像头模块可以为电子设备内部的一个模块,与电子设备中的其他模块通过有线方式进行连接,或者,该摄像头模块也可以为独立于电子设备之外的一个摄像设备,与该电子设备通过有线或无线方式进行连接,此处不做限定。
进一步的,请求对摄像头模块进行访问。
示例性的,如果电子设备检测到了已连接的摄像头模块,则必须通过获取一个相机(Camera)的实例来请求对该摄像头模块进行访问,以确保检测捕获所有的异常;若存在应用程序在使用摄像头模块后,未能正确释放Camera对象,则后续对摄像头的访问都会失败,电子设备能够通过检测获取异常信息,停止后续操作;或者,若未检测到异常,则表明对摄像头模块的访问成功。
值得一提的,若电子设备连接了多于一个摄像头模块,则可根据设置访问指定摄像头模块,缺省可设定为访问第一个;以手机为例,即为访问后置摄像头。
S202、获取实时目标图像的视频帧,并将视频帧依次存储在预设数据缓存中。
具体的,电子设备在检测并访问摄像头模块结束后,对实时目标图像进行采集,其中,目标图像为预设取景范围内的所有可视影像,预设取景范围可以为摄像头模块的取景范围。通过连续对实时目标图像进行采集,可以获取多个连续的视频帧。
同时,申请创建预设数据缓存(Buffer),并将预设数据缓存映射到内存空间中;示例性的,申请操作可以由Camera硬件抽象层(Hardware Abstraction Layer,HAL)执行,通过ioctl函数向UVC驱动申请预设数据缓存,并通过mmap函数映射进内存空间。
其中,ioctl函数为设备驱动程序中的函数,用于对设备的I/O通道进行管理;UVC为通用串行总线(Universal Serial Bus,USB)视频捕获设备的协议标准,用于对符合UVC规格的硬件设备提供支持;mmap函数用于将一个文件或者其它对象映射进内存;且预设数据缓存在内存中为物理地址连续的存储单元。
进一步的,通过Camera HAL获取预设数据缓存在内存中的物理地址,将获得的多个视频帧存储在预设数据缓存中队列的队尾。其中,队列为预设数据缓存中以队列结构管理的存储单元集合,为一种操作受限的表,只允许在队首进行删除操作,在队尾进行插入操作。
值得一提的,对实时目标图像进行采集获取视频帧的过程、将视频帧存储在预设数据缓存中的过程是并行进行的,从采集获取第一个视频帧开始,电子设备即执行存储该视频帧至预设数据缓存中的操作,并在持续采集操作获取后续视频帧的同时,持续执行对后续视频帧的存储。
S203、从预设数据缓存中读取视频帧,并将视频帧输出到用户界面。
具体的,电子设备在检测并访问摄像头模块结束后,生成预览开始指令,创建预览(Preview)线程,执行视频帧到用户界面的输出操作。
示例性的,通过Camera HAL获取预设数据缓存在内存中的物理地址,并将该物理地址传递给绘图模块;其中,绘图模块用于建立绘图图层,并通过输出该绘图图层至用户界面进行显示,实时显示预览目标图像。
在本实施例中,绘图模块可以为Overlay模块或Surface模块。
值得一提的,Overlay模块一般多用于需要高帧率的场景,或,用户界面(User Interface,UI)设计需求的场景;且Overlay需要底层硬件与驱动的支持,否则只能使用Surface进行显示。
示例性的,通过使用Overlay实现在用户界面显示预览目标图像,包括:
获取Camera HAL所传递的预设数据缓存在内存中的物理地址,根据该物理地址,通过Overlay模块的接口,依次从预设数据缓存中队列的队首位置读取视频帧,并在绘图图层上显示该视频帧;通过在用户界面显示该绘图图层,逐帧输出视频帧,实现实时显示预览目标图像。
示例性的,通过使用Surface实现在用户界面显示预览目标图像,包括:
调用函数向Surface注册预设数据缓存,当对实时目标图像进行采集获取视频帧时,通过预览回调函数,将存储当前捕获视频帧数据的预设数据缓存直接传递至Surface进行显示,Surface通过在绘图图层上显示该视频帧,并在用户界面显示该绘图图层,实现实时显示预览目标图像。
值得一提的,从预设数据缓存中读取视频帧的过程、将视频帧输出到用户界面的过程是并行进行的,且与S203中对实时目标图像进行采集获取视频帧的过程、将视频帧存储在预设数据缓存中的过程也是并行进行的。从采集获取第一个视频帧开始,即执行存储该视频帧至预设数据缓存中的操作,绘图图层在从预设数据缓存中读取该视频帧时,随即输出至用户界面;在持续采集操作获取后续视频帧的同时,电子设备持续执行对后续视频帧的存储,且循环调用预览线程从预设数据缓存中读取后续视频帧并输出至用户界面。
S204、接收切换指令,执行拍摄模式的切换。
具体的,在当前Activity内部进行拍摄模式的切换,即在一个Activity内实现相机的拍照模式与摄像模式,以及两种模式之间的切换过程,并在拍摄模式切换过程中保持输出视频帧到用户界面,实时显示预览目标图像,使用户界面的输出不受拍摄模式之间进行切换的影响。
示例性的,若从拍照模式切换为摄像模式,则在当前Activity内部关闭拍照线程,并同时调用摄像线程;在切换过程中,保持循环调用预览线程,不受拍照线程或摄像线程切换的影响,在用户界面上实时显示预览目标图像;
或者,若从摄像模式切换为拍照模式,则在当前Activity内部关闭摄像线程,并调用拍照线程;在切换过程中,保持循环调用预览线程,不受拍照线程或摄像线程切换的影响,在用户界面上实时显示预览目标图像;
其中,拍照线程用于执行操作在接收拍照指令后,从预设数据缓存中提取单个目标视频帧,并通过编码压缩处理,得到预设图片格式的图像文件,保存至设备存储,实现从摄像头接收图片并保存的过程;拍照指令可以为由用户点击按键触发的指令,也可以为在满足预设拍照条件时由设备触发的指令,此处不做限制;在本实施例中,预设图片格式可以为JPEG、bmp格式,且上述预设图片格式仅为示例性的,包括但不限于此。
摄像线程用于执行操作在接收摄像指令后,直接采集获取连续目标视频帧,并通过编码压缩处理,得到预设视频格式的视频文件,保存至设备存储,实现从摄像头录制视频并保存的过程;摄像指令可以为由用户点击按键触发的指令,也可以为在满足预设摄像条件时由设备触发的指令,此处不做限制;在本实施例中,预设视频格式可以为MP4、AVI格式,且上述预设视频格式仅为示例性的,包括但不限于此。
本发明的实施例提供一种切换拍摄模式方法,将获取的实时目标图像的视频帧依次存储在预设数据缓存中,通过从预设数据缓存中依次读取视频帧,在用户界面上实时显示预览目标图像,并在一个Activity内部调整资源完成拍摄模式的切换,且在切换过程中保持用户界面对实时影像的预览。这样,消除了在两种拍摄模式之间进行切换时产生的延时或中断,避免了对预览画面进行不必要的调整。
本发明实施例还提供一种电子设备00,如图3所示,该电子设备00包括:
采集存储单元001,用于连续采集获取目标图像的多个视频帧,并将多个视频帧依次存储在预设数据缓存中,目标图像为预设取景范围内的可视影像;
显示预览单元002,用于从预设数据缓存中依次读取多个视频帧,并依次将多个视频帧输出到用户界面,以实时显示预览目标图像;
模式切换单元003,用于接收切换指令,在当前活动Activity内部进行拍摄模式切换,并在拍摄模式切换过程中保持输出从预设数据缓存中读取的视频帧到用户界面,以实时显示预览目标图像。
可选的,采集存储单元001具体用于:
申请创建预设数据缓存,并将预设数据缓存映射到内存空间中;
将获得的多个视频帧依次存储在预设数据缓存中队列的队尾,队列为预设数据缓存中以队列结构管理的存储单元集合。
可选的,显示预览单元002具体用于:
创建预览线程,预览线程包括从预设数据缓存中队列的队首位置读取视频帧,并将视频帧输出到用户界面;
循环调用预览线程,在用户界面上实时显示预览目标图像。
可选的,模式切换单元003具体用于:
若从拍照模式切换为摄像模式,则在当前Activity内部关闭拍照线程,并调用摄像线程;或,若从摄像模式切换为拍照模式,则在当前Activity内部关闭摄像线程,并调用拍照线程;在切换过程中,保持循环调用预览线程,在用户界面上实时显示预览目标图像;
拍照线程包括在接收拍照指令后,从预设数据缓存中提取单个目标视频帧,并进行编码压缩处理得到图像文件;摄像线程包括在接收摄像指令后,对目标图像进行采集获取连续目标视频帧,并对连续目标视频帧进行编码压缩处理得到视频文件。
可选的,电子设备00还包括:
检测访问单元004,用于检测摄像头模块是否存在,并在检测确定存在后,请求对摄像头模块进行访问。
本发明的实施例提供一种电子设备,将获取的实时目标图像的视频帧依次存储在预设数据缓存中,通过从预设数据缓存中依次读取视频帧,在用户界面上实时显示预览目标图像,并在一个Activity内部调整资源完成拍摄模式的切换,且在切换过程中保持用户界面对实时影像的预览。这样,消除了在两种拍摄模式之间进行切换时产生的延时或中断,避免了对预览画面进行不必要的调整。
通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的方法和装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。