屏幕录制方法和装置与流程

文档序号:33618443发布日期:2023-03-25 10:09阅读:25来源:国知局
1.本技术实施例涉及多媒体技术。更具体地讲,涉及一种屏幕录制方法和装置。
背景技术
::2.随着安卓(android)智能显示设备(如智能电视)的普及,白板等智能软件在教育、会议、家庭娱乐等场景中的应用越来越多,用户可以在白板上进行书写、绘画等,并可将结果保存分享。3.当用户需要录制视频时,对于显示在屏幕显示(onscreendisplay,osd)层的内容,采用android原生的屏幕采集接口(仅能录制osd层显示的图像)即可实现屏幕录制。4.但白板的书写过程显示在视频(video)层,书写结果显示在osd层,因此,使用android原生的屏幕采集接口录制的视频中仅有书写结果,没有书写的过程,并且,由于无法录制video层显示区域,导致录制的视频中该区域全是黑屏,严重影响用户体验。技术实现要素:5.为了解决上述技术问题或者至少部分的解决上述技术问题,本技术提供了一种屏幕录制方法和装置,可以解决在录制包括白板书写的视频时,录制的视频仅有书写的结果,没有书写的过程的问题。6.第一方面,本技术实施例提供了一种屏幕录制方法,该方法包括:响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据:获取与第i帧待合成屏幕数据对应的video层的目标白板数据,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近;将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据;其中,i为0,1,2,3……。7.本技术一些实施例中,获取osd层的第i帧待合成屏幕数据之前,该方法还包括:创建自定义glsurfaceview,以及与自定义glsurfaceview对应的自定义opengl渲染器,自定义opengl渲染器包括外部录屏纹理管线和纹理叠加管线;将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,包括:通过外部录屏纹理管线处理第i帧待合成屏幕数据,得到第i帧纹理;通过纹理叠加管线处理第i帧纹理和目标白板数据,得到第i帧合成数据。8.本技术一些实施例中,获取osd层的每帧待合成屏幕数据,包括:监听osd层的数据缓存区的数据可用事件;当监听到预设次数的数据可用事件后,从数据缓存区获取osd层的数据。9.本技术一些实施例中,将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据之后,该方法还包括:显示第i帧合成数据,以播放视频数据;或者,对第i帧合成数据进行编码处理,以生成编码后的视频数据。10.本技术一些实施例中,对第i帧合成数据进行编码处理之前,该方法还包括:判断是否满足第一条件,第一条件为当前时刻与目标采集时刻的差值小于或等于时长阈值,且当前处于视频录制状态;对所述第i帧合成数据进行编码处理,包括:在满足第一条件的情况下,对第i帧合成数据进行编码处理;该方法还包括:在不满足第一条件的情况下,丢弃第i帧合成数据。11.本技术一些实施例中,经过编码处理的第i帧合成数据包括时间戳,时间戳用于指示对第i帧合成数据进行编码处理的时刻与目标时刻的差值;在满足第一条件的情况下,对第i帧合成数据进行编码处理,包括:在满足第一条件的情况下,检测当前是否处于数据合成状态;在当前处于数据合成状态的情况下,对第i帧合成数据进行编码处理,将第一差值与接收到录屏指令的系统时刻之和确定为目标时刻,第一差值为0,或者,第一差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值;在当前处于数据暂停状态的情况下,对第i帧合成数据进行编码处理,并将数据暂停状态切换为数据合成状态,将第二差值与接收到录屏指令的系统时刻之和确定为目标时刻,第二差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值。12.本技术一些实施例中,在不满足第一条件的情况下,丢弃第i帧合成数据,包括:在不满足第一条件的情况下,检测当前是否处于数据合成状态;在当前处于数据合成状态的情况下,将数据合成状态设置为数据暂停合成状态,记录当前将数据合成状态切换为数据暂停合成状态的时刻,并丢弃第i帧合成数据;在当前处于数据暂停合成状态的情况下,丢弃第i帧合成数据。13.本技术一些实施例中,在对第i帧合成数据进行编码处理,以生成编码后的视频数据之后,在按照目标倍速播放编码后的视频数据时,将时间戳与目标倍速的倒数的乘积作为播放第i帧合成数据与播放下一帧合成数据的时间间隔。14.第二方面,本技术提供了一种屏幕录制装置,该装置包括:获取模块和合成模块;该获取模块,用于响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据:该获取模块,还用于获取与第i帧待合成屏幕数据对应的video层的目标白板数据,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近;该合成模块,用于将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据;其中,i为0,1,2,3……。15.第三方面,本技术提供了一种电子设备,该电子设备包括处理器、存储器及存储在该存储器上并可在该处理器上运行的计算机程序,该计算机程序被该处理器执行时实现如第一方面所述的屏幕录制方法的步骤。16.第四方面,本技术提供了一种计算机可读存储介质,包括:计算机可读存储介质上存储计算机程序,计算机程序被处理器执行时实现如第一方面所示的屏幕录制方法。17.第五方面,本技术提供了一种计算机程序产品,包括:当计算机程序产品在计算机上运行时,使得计算机实现如第一方面所示的屏幕录制方法。18.本技术实施例提供的技术方案与现有技术相比具有如下优点:本技术实施例中,响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据:获取与第i帧待合成屏幕数据对应的video层的目标白板数据,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近;将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据;其中,i为0,1,2,3……。将获取到的osd层的一帧屏幕数据和对应的video层的一帧白板数据进行合成处理,得到一帧合成数据,基于多帧合成数据即可得到录制的视频数据,该视频数据的每帧既包括osd层数据也包括video层数据,解决了android原生视频录制仅可录制osd层数据的痛点。如此,当需要录制白板的书写、绘画等视频时,通过本方案录制的视频中不但有书写结果,也有书写过程,完整复制了在白板上的整个操作过程,方便用户后续观看。附图说明19.为了更清楚地说明本技术实施例或相关技术中的实施方式,下面将对实施例或相关技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本技术的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。20.图1示出了根据一些实施例的显示设备与控制装置之间操作场景的示意图;21.图2示出了根据一些实施例的控制装置100的硬件配置框图;22.图3示出了根据一些实施例的显示设备200的硬件配置框图;23.图4示出了根据一些实施例的android原生屏幕录制结构示意图;24.图5示出了根据一些实施例的屏幕录制的各功能模块的关系图示意图;25.图6示出了根据一些实施例的屏幕录制方法的流程示意图之一;26.图7示出了根据一些实施例的屏幕录制方法的流程示意图之二;27.图8示出了根据一些实施例的屏幕录制方法的流程示意图之三;28.图9示出了根据一些实施例的屏幕录制方法的流程示意图之四;29.图10示出了根据一些实施例的屏幕录制方法的流程示意图之五;30.图11示出了根据一些实施例的屏幕录制方法的流程示意图之六;31.图12示出了根据一些实施例的屏幕录制装置的结构示意图;32.图13示出了根据一些实施例的一种电子设备的硬件结构示意图。具体实施方式33.为使本技术的目的和实施方式更加清楚,下面将结合本技术示例性实施例中的附图,对本技术示例性实施方式进行清楚、完整地描述,显然,描述的示例性实施例仅是本技术一部分实施例,而不是全部的实施例。34.需要说明的是,本技术中对于术语的简要说明,仅是为了方便理解接下来描述的实施方式,而不是意图限定本技术的实施方式。除非另有说明,这些术语应当按照其普通和通常的含义理解。35.本技术中说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”等是用于区别类似或同类的对象或实体,而不必然意味着限定特定的顺序或先后次序,除非另外注明。应该理解这样使用的用语在适当情况下可以互换。36.术语“包括”和“具有”以及他们的任何变形,意图在于覆盖但不排他的包含,例如,包含了一系列组件的产品或设备不必限于清楚地列出的所有组件,而是可包括没有清楚地列出的或对于这些产品或设备固有的其它组件。37.本技术实施例提供的屏幕录制方法可以用于显示设备,该显示设备可以具有多种实施形式,例如,可以是电视、智能电视、激光投影设备、显示器(monitor)、电子白板(electronicbulletinboard)、电子桌面(electronictable)、手机、平板电脑、笔记本电脑、掌上电脑、车载电子设备等。38.图1为根据实施例中显示设备与控制设备之间操作场景的示意图,其中控制设备包括智能设备或控制装置。如图1所示,用户可通过智能设备300或控制装置100操作显示设备200。39.在一些实施例中,控制装置100可以是遥控器,遥控器和显示设备的通信包括红外协议通信或蓝牙协议通信,及其他短距离通信方式,通过无线或有线方式来控制显示设备200。用户可以通过遥控器上按键、语音输入、控制面板输入等输入用户指令,来控制显示设备200。40.在一些实施例中,也可以使用智能设备300(如移动终端、平板电脑、计算机、笔记本电脑等)以控制显示设备200。例如,使用在智能设备上运行的应用程序控制显示设备200。41.在一些实施例中,显示设备可以不使用上述的智能设备或控制设备接收指令,而是通过触摸或者手势等接收用户的控制。42.在一些实施例中,显示设备200还可以采用除了控制装置100和智能设备300之外的方式进行控制,例如,可以通过显示设备200设备内部配置的获取语音指令的模块直接接收用户的语音指令控制,也可以通过显示设备200设备外部设置的语音控制设备来接收用户的语音指令控制。43.在一些实施例中,显示设备200还与服务器400进行数据通信。可允许显示设备200通过局域网(lan)、无线局域网(wlan)和其他网络进行通信连接。服务器400可以向显示设备200提供各种内容和互动。服务器400可以是一个集群,也可以是多个集群,可以包括一类或多类服务器。44.图2示例性示出了根据示例性实施例中控制装置100的配置框图。如图2所示,控制装置100包括控制器110、通信接口130、用户输入/输出接口140、外部存储器、供电电源。控制装置100可接收用户的输入操作指令,且将操作指令转换为显示设备200可识别和响应的指令,起用用户与显示设备200之间交互中介作用。45.如图3,显示设备200包括调谐解调器210、通信器220、检测器230、外部装置接口240、控制器250、显示器260、音频输出接口270、用户接口280、外部存储器、供电电源中的至少一种。46.在一些实施例中控制器包括处理器,视频处理器,音频处理器,图形处理器,ram,rom,用于输入/输出的第一接口至第n接口。47.显示器260包括用于呈现画面的显示屏组件,以及驱动图像显示的驱动组件,用于接收源自控制器输出的图像信号,进行显示视频内容、图像内容以及菜单操控界面的组件以及用户操控ui界面。48.显示器260可为液晶显示器、oled显示器、以及投影显示器,还可以为一种投影装置和投影屏幕。49.通信器220是用于根据各种通信协议类型与外部设备或服务器进行通信的组件。例如:通信器可以包括wifi模块,蓝牙模块,有线以太网模块等其他网络通信协议芯片或近场通信协议芯片,以及红外接收器中的至少一种。显示设备200可以通过通信器220与外部控制装置100或服务器400建立控制信号和数据信号的发送和接收。50.用户接口280,可用于接收控制装置100(如:红外遥控器等)的控制信号。也可以用于直接接收用户的输入操作指令,且将操作指令转换为显示设备200可识别和响应的指令,此时可以称为用户输入接口。51.检测器230用于采集外部环境或与外部交互的信号。例如,检测器230包括光接收器,用于采集环境光线强度的传感器;或者,检测器230包括图像采集器,如摄像头,可以用于采集外部环境场景、用户的属性或用户交互手势,再或者,检测器230包括声音采集器,如麦克风等,用于接收外部声音。52.外部装置接口240可以包括但不限于如下:高清多媒体接口(hdmi)、模拟或数据高清分量输入接口(分量)、复合视频输入接口(cvbs)、usb输入接口(usb)、rgb端口等任一个或多个接口。也可以是上述多个接口形成的复合型的输入/输出接口。53.调谐解调器210通过有线或无线接收方式接收广播电视信号,以及从多个无线或有线广播电视信号中解调出音视频信号,如以及epg数据信号。54.在一些实施例中,控制器250和调谐解调器210可以位于不同的分体设备中,即调谐解调器210也可在控制器250所在的主体设备的外置设备中,如外置机顶盒等。55.控制器250,通过存储在存储器(内部存储器或外部存储器)上中各种软件控制程序,来控制显示设备的工作和响应用户的操作。控制器250控制显示设备200的整体操作。例如:响应于接收到用于选择在显示器260上显示ui对象的用户命令,控制器250便可以执行与由用户命令选择的对象有关的操作。56.在一些实施例中控制器包括中央处理器(centralprocessingunit,cpu),视频处理器,音频处理器,图形处理器(graphicsprocessingunit,gpu),以及随机存取存储器(randomaccessmemory,ram),只读存储器(read-onlymemory,rom),用于输入/输出的第一接口至第n接口,通信总线(bus)等中的至少一种。57.其中,ram也叫主存,是与控制器直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。它与rom的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。ram在计算机和数字系统中用来暂时存储程序、数据和中间结果。rom以非破坏性读出方式工作,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失,所以又称为固定存储器。58.用户可在显示器260上显示的图形用户界面(gui)输入用户命令,则用户输入接口通过图形用户界面(gui)接收用户输入命令。或者,用户可通过输入特定的声音或手势进行输入用户命令,则用户输入接口通过传感器识别出声音或手势,来接收用户输入命令。[0059]“用户界面”,是应用程序或操作系统与用户之间进行交互和信息交换的介质接口,它实现信息的内部形式与用户可以接受形式之间的转换。用户界面常用的表现形式是图形用户界面(graphicuserinterface,gui),是指采用图形方式显示的与计算机操作相关的用户界面。它可以是在显示设备的显示屏中显示的一个图标、窗口、控件等界面元素,其中控件可以包括图标、按钮、菜单、选项卡、文本框、对话框、状态栏、导航栏、widget等可视的界面元素。[0060]为了便于理解本技术实施例的方案,下述对安卓原生的屏幕录制原理及涉及的名词进行解释说明:[0061]android提供的原生屏幕录制:android原生提供mediaprojection服务进行屏幕录制。其录制相关模块如图4所示。其中,媒体投影服务(mediaprojectionmanager)是android系统提供的,媒体投影(mediaprojection)用于截取显示设备的屏幕中的图像,然后将截取的图像投影到虚拟屏幕(virtualdisplay)上,虚拟屏幕会在surface上呈现该图像,surface充当屏幕数据缓冲区的作用,surface可以是基于媒体录制(mediarecorder)生成的,以供mediarecorder消费,实现视频录制,也可以是基于媒体编解码器(mediacodec)生成的,以供mediacodec消费,以对surface中的图像进行重新编码生成新的视频。[0062]具体地,mediaprojection和mediaprojectionmanager,是android提供的系统录屏接口,且不需要root权限,但使用时会弹出录屏权限申请框,用户同意后才能开始录屏,mediaprojectionmanager是一个系统级的服务,用于管理mediaprojection。下面以消费者和生产者对屏幕录制流程进行说明。屏幕数据源(生产者)在缓冲区产生数据,屏幕数据消费者从缓冲区提取数据使用,不同的消费者可以实现不同的功能,比如录屏保存和录屏直播(屏幕共享)。virtualdisplay是android上的虚拟屏幕,用于抓取屏幕上显示的内容,是屏幕数据的生产者,surface对应了一块屏幕数据缓冲区,屏幕数据生产者可以在surface上生产数据,消费者则从surface中提取数据使用。[0063]mediacodec和mediarecorder,mediacodec更偏向原生,而mediarecorder偏向的上层封装。mediacodec处理视频的时候可以接触到视频流数据,可以处理原生的视频数据,如需要视频叠加技术、添加字幕等就在此处理。mediarecorder类相对于mediacodec简单,因为其已经封装好,调用接口即可实现视频的录制,如:设置视频的编码格式、视频的保存路径、视频来源等,便可得到录制好的视频,但也因此接触不到视频流数据了,处理不了原生的视频数据了。[0064]随着android智能商用电视的普及,白板等智能软件在教育、会议、家庭娱乐等场景中应用越来越多。用户可以选择书写、绘画、板书等操作,并可将结果保存分享。由于白板的书写、擦除等操作对时延的要求很高,一般并不采用android原生的屏幕刷新机制,而是采用客制化的刷新机制将实时书写的图形直接调用nativeframebuffer接口进行局部刷新绘制,这样书写时延可由120ms优化至50ms以内。但由于书写采用的不是osd层绘制,采用android原生的屏幕采集接口mediaprojection无法对书写过程进行录制,导致用户无法回顾书写过程。针对上述问题,本技术提供将osd层和video层屏幕数据实时录制合成的方案,避免录制的视频只能正确显示osd层内容的问题。[0065]如图5所示为本技术实施例提供的屏幕录制的各功能模块的关系图,包括:白板应用501,媒体投影管理服务502,媒体投影503,虚拟屏幕504,surface505,位图506,自定义view书写507,native层508,自定义glsurfaceview509,自定义opengl渲染器5091,外部录屏纹理管线50911,纹理叠加管线50912,缓存区50913,屏幕,自定义egl线程510,虚拟屏幕gl管线5101,编码器5102。[0066]具体地,白板应用501可以是任意的需要使用白板书写、绘画的应用,启动白板应用501后,基于接收到的录屏指令(即获取到录屏的权限),白板应用501获取到录屏权限(启动安卓原生的录屏,会弹出提示框,用于获取录制权限);媒体投影管理服务502,媒体投影503,虚拟屏幕504的作用参考图4中的描述,此处不再赘述。[0067]surface505与图4中surface不同,surface505是基于surfacetexture生成的。其中,surfacetexture可以实时捕获录屏的数据,但并不直接显示到屏幕上,而是转换为opengl的外部纹理。[0068]白板应用501在初始化界面的过程中,会创建位图506,当接收到书写数据时,会实时渲染更新位图506中的数据,位图506会传递native层508以实现白板书写,位图506同时传递至自定义view书写507(即video层的书写数据)。[0069]自定义glsurfaceview509从surface505获取osd层的屏幕数据以及从自定义view书写507获取到video层508的书写数据,具体地,将从surface505获取的osd层的屏幕数据输入到自定义opengl渲染器5091的外部录屏纹理管线50911中得到纹理,将该纹理及从自定义view书写507获取到video层的书写数据输入到自定义opengl渲染器5091的纹理叠加管线50912中得到叠加纹理,将叠加纹理存储在缓存区50913。[0070]自定义glsurfaceview509,继承自android原生提供的glsurfaceview,可通过单独的线程(glthread)进行opengl图形渲染,同时提供egl(embeddedgrahpiclibrary)环境将图形渲染到屏幕上。本模块提供自定义openg渲染器,其绘制运行在与ui线程分离的glthread线程内。具体的合成功能由自定义opengl可编程管线实现,包括外部录屏纹理管线和纹理叠加管线,两个管线均是输出到framebuffer而非直接输出到屏幕中,合成完成后,一方面可以将合成的视频输出到屏幕中(以透明方式显示,用户无感知),另一方面,可以将合成的视频通过自定义egl输出到编码器中。其中自定义egl环境的opengl相关的操作都在新创建的子线程中运行,避免影响原来的绘制速度。[0071]缓存区50913的叠加纹理可以通过egl输出到屏幕中,也可以作为自定义egl线程510中虚拟屏幕gl管线5101的输入,通过自定义egl将虚拟屏幕gl管线5101的输出输入到编码器5102中进行编码处理。[0072]glsurfaceview是管理openglsurface的一个特殊的view,可以把opengl的surface渲染到android的view上,并且封装了很多创建opengl环境所需要的配置,使得使用opengl更方便。glsurfaceview主要包括以下能力:提供一个opengl的渲染线程,以防止渲染阻塞主线程;提供连续渲染或按需渲染能力;封装egl相关资源和创建和释放,极大地简化了opengl与窗口系统接口的使用方式。自定义glsurfaceview继承自glsurfaceview,可以调用glsurfaceview提供得任意功能。[0073]开放图形库(opengraphicslibrary,opengl),也可译为开放式图形库,用于渲染2d、3d矢量图形的跨语言、跨平台的应用程序编程接口。opengl是一个操作图形处理器(graphicsprocessingunit,gpu)的接口,它通过驱动向gpu发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及与本地窗口系统进行交互时,就需要一个中间层,且该中间层最好是与平台无关的。这个中间控制层就是egl,实现将图形渲染到屏幕上。[0074]surfacetexture用于捕获视频流中的视频帧,但对视频帧的处理并不直接显示,而是转为opengl的外部纹理,因此可用于视频流数据的二次处理(如摄像头滤镜、桌面特效等)。[0075]本技术实施例中,提供了一种屏幕录制方法,下面结合图6,以该方法应用于显示设备为例,对本技术实施例提供的屏幕录制方法进行示例性的说明。该方法可以包括下述的步骤601至步骤603。[0076]601、响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据。[0077]可以理解,显示设备启动白板应用,接收到录屏指令,即获取到录制屏幕的权限,调用android系统提供的媒体投影服务录制osd层的数据。[0078]可以理解,获取osd层的第i帧待合成屏幕数据,具体地,获取osd层的屏幕数据的频率可以与采集osd层的屏幕数据的频率相同,也可以小于采集osd层的屏幕数据的频率,具体根据实际需要确定,本技术实施例不做限定。[0079]可以理解,第i帧待合成屏幕数据是开始屏幕录制后,按一定频率获取的任一帧osd层的屏幕数据,即获取的osd层的任一帧图像。[0080]602、获取与第i帧待合成屏幕数据对应的video层的目标白板数据。[0081]其中,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近。[0082]可以理解,当有书写操作时,则存储白板数据的缓冲区即会被更新,目标白板数据的目标采集时刻即位图的更新时刻。当获取到第i帧待合成屏幕数据后,即从白板数据对应的缓存区获取最新的一帧白板数据,即目标白板数据。[0083]可以理解,目标白板数据即为获取的video层一帧图像。[0084]603、将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据。[0085]其中,将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据,i为0,1,2,3……。[0086]可以理解,经过合成处理的每帧数据为视频流数据,基于多帧合成数据即可得到录制的视频数据。[0087]本技术实施例中,响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据:获取与第i帧待合成屏幕数据对应的video层的目标白板数据,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近;将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据;其中,i为0,1,2,3……。将获取到的osd层的一帧屏幕数据和对应的video层的一帧白板数据进行合成处理,得到一帧合成数据,基于多帧合成数据即可得到录制的视频数据,该视频数据的每帧既包括osd层数据也包括video层数据,解决了android原生视频录制仅可录制osd层数据的痛点。如此,当需要录制白板的书写、绘画等视频时,通过本方案录制的视频中不但有书写结果,也有书写过程,完整复制了在白板上的整个操作过程,方便用户后续观看。[0088]本技术实施例中的对于osd层的屏幕数据与video层的白板数据的合成可以通过自定义glsurfaceview实现,还可以通过其他合成技术实现,具体根据实际需要确定,本技术实施例不做限定。下述以自定义glsurfaceview实现数据的合成为例进行说明。[0089]本技术一些实施例中,结合图6,如图7所示,上述步骤601之前,本技术实施例提供的屏幕录制返回发还包括下述步骤604,上述步骤603具体可以通过下述步骤603a和步骤603b实现。[0090]604、创建自定义glsurfaceview,以及与自定义glsurfaceview对应的自定义opengl渲染器,自定义opengl渲染器包括外部录屏纹理管线和纹理叠加管线。[0091]可以理解,自定义glsurfaceview,可以设置为透明显示,透明是为了不影响应用原来的显示,以用户无感知的方式进行后台录制,同时将osd层与video层合成的视频透明显示。[0092]603a、通过外部录屏纹理管线处理第i帧待合成屏幕数据,得到第i帧纹理。[0093]603b、通过纹理叠加管线处理第i帧纹理和目标白板数据,得到第i帧合成数据。[0094]可以理解,纹理是一种可供着色器读写的量化颜色信息的结构化存储形式,例如一张图片参数为xyz,x,y代表该图片对应像素点坐标,z代表该像素点所存储对应rgba值(或者其他想存储信息),纹理除了包含必要信息以外,还包含一些纹理采样的设置。将对纹理得处理过程称为纹理管线。具体地纹理以及纹理管线的描述可以参考现有技术,此处不做赘述。[0095]可以理解,经过纹理叠加管线处理第i帧纹理和目标白板数据,得到第i帧合成数据,该合成数据也一帧纹理。[0096]本技术一些实施例中,获取osd层的第i帧待合成屏幕数据之前,创建自定义glsurfaceview,以及与自定义glsurfaceview对应的自定义opengl渲染器,自定义opengl渲染器包括外部录屏纹理管线和纹理叠加管线;通过外部录屏纹理管线处理第i帧待合成屏幕数据,得到第i帧纹理;通过纹理叠加管线处理第i帧纹理和目标白板数据,得到第i帧合成数据。如此,通过自定义glsurfaceview实现了对osd层的屏幕数据与video层的白板数据的合成,进而实现对osd层和video层内容的录制,以使录制的白板书写的视频中包含书写过程和书写结果。[0097]本技术一些实施例中,结合图6,如图8所示,上述步骤601具体可以通过下述步骤601a和步骤601b实现。[0098]601a、监听osd层的数据缓存区的数据可用事件。[0099]601b、当监听到预设次数的数据可用事件后,从数据缓存区获取osd层的数据。[0100]其中,预设次数可以是大于等于1的整数,具体预设次数根据实际需要确定,本技术实施例不做限定。[0101]可以理解,屏幕录制采用glsurfaceview外部纹理输入,其刷新速度非常高(大约16ms刷新一次)。另一方面,书写的频率由用户控制,其频率不固定,可能每10ms刷新一次,也可能很长时间不刷新。这就导致自定义glsurfaceview的输入输出过于频繁,而一般对于录制合成的视频的帧率的要求并不高,如25fps的帧率即可满足。因此,当收到屏幕录制数据可用事件(刷新帧率为60fps)时,可以降低渲染频率,请求自定义opengl渲染器进行按需渲染,即接收到多次数据可用事件,仅获取一次屏幕数据输入至自定义glsurfaceview中进行处理。如:将渲染频率降低为原始频率的一半,即收到两次数据可用事件,只执行一次渲染,具体地,设置录屏渲染计数器(即对上报的数据可用事件进行计数),当其为偶数时获取数据进行后续渲染处理,若为奇数,则丢弃该数据,不做渲染处理。[0102]可以理解,设置屏幕数据缓存区的数据可用时监听,当有新的数据存入时,会上报一次数据可用事件。本方案中,可以是接收到一次数据可用事件,即获取一次屏幕数据,也可以是接收到多次数据可以事件后,获取一次屏幕数据。具体地,从数据缓存区获取osd层的数据,可以是获取缓存区存储的任一帧屏幕数据(缓存区一般较小,存储的数据为至少一帧连续的屏幕数据,相邻多帧屏幕数据之间差异较小,人眼无法区分),也可以是获取缓存区固定位置(如缓存区中可以存储3帧数据,每帧数据按照存储的先后顺序标有0,1,2,则每次获取标号为1的一帧数据)的一帧屏幕数据,还可以是获取最新的一帧屏幕数据,具体根据实际情况确定,本技术实施例不做限定。[0103]本技术一些实施例中,监听osd层的数据缓存区的数据可用事件;当监听到预设次数的数据可用事件后,从数据缓存区获取osd层的数据。如此,可以根据需求降低自定义glsurfaceview的输入频率,进而减少了自定义glsurfaceview需要处理的数据的量,使得消耗的资源减少,提升了自定义glsurfaceview处理能力。[0104]本技术一些实施例中,结合图6,如图9所示,上述步骤603之后,本技术实施例提供的屏幕录制方法还包括下述步骤605或者步骤606。[0105]605、显示第i帧合成数据,以播放视频数据。[0106]606、对第i帧合成数据进行编码处理,以生成编码后的视频数据。[0107]可以理解,显示第i帧合成数据,以播放视频数据,即可以将第i帧合成数据显示到屏幕中,可以是透明方式显示,使得用户无感知;显示第i帧合成数据,还包括调用mediarecorder接口,直接生成视频数据(输入合成数据,输出视频数据)。[0108]可以理解,还可以是对第i帧合成数据进行编码处理,编码处理可以改变时间戳。[0109]本技术一些实施例中,将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据之后,该方法还包括:显示第i帧合成数据,以播放视频数据;或者,对第i帧合成数据进行编码处理,以生成编码后的视频数据。如此,可以根据实际需要,灵活选择对合成数据的处理。[0110]本技术一些实施例中,结合图9,如图10所示,上述步骤606之前,本技术实施例提供的屏幕录制方法还包括下述步骤607和步骤608,上述步骤606具体可以通过下述步骤606a实现。[0111]607、判断是否满足第一条件。[0112]其中,第一条件为当前时刻与目标采集时刻的差值小于或等于时长阈值,且当前处于视频录制状态。[0113]是则执行下述步骤606a,否则执行下述步骤608。[0114]606a、对第i帧合成数据进行编码处理。[0115]608、丢弃第i帧合成数据。[0116]可以理解,接收到视频录制指令,则处于视频录制状态,接收到视频暂停或者结束指令,则处于视频暂停录制状态。[0117]可以理解,在当前时刻与目标采集时刻的差值小于或等于时长阈值,且当前处于视频录制状态的情况下,对第i帧合成数据进行编码处理;在当前时刻与目标采集时刻的差值大于时长阈值,或者,当前处于视频暂停录制状态的情况下,丢弃第i帧合成数据。[0118]可以理解,当前时刻与目标采集时刻的差值大于时长阈值,表明长时间没有书写操作,白板数据缓冲区对应的数据长时间未更新,因此,可以将合成的数据丢弃,无需再进行编码处理,节省了编码处理需要耗费的资源。[0119]本技术一些实施例中,判断是否满足第一条件,第一条件为当前时刻与目标采集时刻的差值小于或等于时长阈值,且当前处于视频录制状态;在满足第一条件的情况下,对第i帧合成数据进行编码处理;在不满足第一条件的情况下,丢弃第i帧合成数据。如此,在用户长时间无书写操作的情况下,对于合成数据直接丢弃,无需进行后续的编码处理,节省了编码需要耗费的资源。[0120]本技术一些实施例中,结合图10,如图11所示,上述步骤606a具体可以通过下述步骤606b至步骤606d实现,上述步骤608具体可以通过下述步骤608a至步骤608c实现。[0121]其中,经过编码处理的第i帧合成数据包括时间戳,时间戳用于指示对第i帧合成数据进行编码处理的时刻与目标时刻的差值。[0122]606b、检测当前是否处于数据合成状态。[0123]是则执行步骤606c,否则执行步骤606d。[0124]其中,步骤606b是在满足第一条件的情况下执行的。[0125]606c、对第i帧合成数据进行编码处理,将第一差值与接收到录屏指令的系统时刻之和确定为目标时刻。[0126]其中,第一差值为0,或者,第一差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值。[0127]可以理解,在接收到录屏指令后,若没有数据合成状态的切换操作,则第一差值为0;若有数据合成状态的切换操作,则第一差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值。[0128]可以理解,对第i帧合成数据进行编码处理的时刻,可以是编码器接收到第i帧合成数据的时刻,也可以是编码器开始对第i帧合成数据进行处理的时刻,还可以是检测到当前处于数据合成状态的时刻,具体根据实际需要确定,本技术实施例不做限定。[0129]606d、对第i帧合成数据进行编码处理,并将数据暂停状态切换为数据合成状态,将第二差值与接收到录屏指令的系统时刻之和确定为目标时刻。[0130]其中,第二差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值。[0131]可以理解,第i帧合成数据进行编码处理,并将数据暂停状态切换为数据合成状态,该切换对应的第一时刻即为上一次从数据合成状态切换为数据暂停合成状态的时刻,第二差值用于指示对第i帧合成数据进行编码处理的时刻与第一时刻的差值。[0132]608a、检测当前是否处于数据合成状态。[0133]是则执行步骤608b,否则执行步骤608c。[0134]其中,步骤608a是在不满足第一条件的情况下执行的。[0135]608b、将数据合成状态设置为数据暂停合成状态,记录当前将数据合成状态切换为数据暂停合成状态的时刻,并丢弃第i帧合成数据。[0136]608c、丢弃第i帧合成数据。[0137]可以理解,记录的当前将数据合成状态切换为数据暂停合成状态的时刻,用于计算第一差值和第二差值。[0138]可以理解,在用户长时间无书写操作或者处于暂停录制状态的情况下,录制的视频会一直卡在一帧,严重影响后续用户的观看体验。因此,在对录制的视频进行编码处理的过程中,通过改变时间戳可以避免卡帧现象的出现。[0139]示例性地,时长阈值为30ms,目标时刻为:08:00:00:00,目标采集时刻为08:00:00:00,得到第1帧合成数据,当前时刻为08:00:00:10,当前时刻与目标采集时刻的差值为10ms,小于30ms,对第1帧合成数据进行编码处理,添加的时间戳为10。目标采集时刻为08:0.5=0.5ms,第2帧播放2-1=1ms,播放完第1帧和第2帧需要1.5ms;相较于原播放完第1帧和第2帧的时长,时长缩短了一半,即播放速度提升了2倍。[0145]本技术实施例中,在按照目标倍速播放编码后的视频数据时,将时间戳与目标倍速的倒数的乘积作为播放第i帧合成数据与播放下一帧合成数据的时间间隔。如此,对于录制的视频,为了适应不同用户的不同需求,可以将录制的视频进行不同的倍速播放,进一步提升用户体验。[0146]本技术实施例中,如图12所示,提供了一种屏幕录制装置,该装置包括:获取模块1201和合成模块1202;该获取模块1201,用于响应于接收的录屏指令,获取osd层的第i帧待合成屏幕数据:该获取模块1201,还用于获取与第i帧待合成屏幕数据对应的video层的目标白板数据,目标白板数据的目标采集时刻,与第i帧待合成屏幕数据的采集时刻最近;该合成模块1202,用于将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据;其中,i为0,1,2,3……。[0147]本技术一些实施例中,该装置还包括:创建模块;该创建模块,用于在获取osd层的第i帧待合成屏幕数据之前,创建自定义glsurfaceview,以及与自定义glsurfaceview对应的自定义开放图形库opengl渲染器,自定义opengl渲染器包括外部录屏纹理管线和纹理叠加管线;该合成模块1202,具体用于通过外部录屏纹理管线处理第i帧待合成屏幕数据,得到第i帧纹理;通过纹理叠加管线处理第i帧纹理和目标白板数据,得到第i帧合成数据。[0148]本技术一些实施例中,该获取模块1201,还用于监听osd层的数据缓存区的数据可用事件;当监听到预设次数的数据可用事件后,从数据缓存区获取osd层的数据。[0149]本技术一些实施例中,该装置还包括:显示模块和编码模块;该显示模块,用于在将第i帧待合成屏幕数据与目标白板数据进行合成处理,得到第i帧合成数据,以录制包括osd层数据和video层数据的视频数据之后,显示第i帧合成数据,以播放视频数据;或者,该编码模块,用于对第i帧合成数据进行编码处理,以生成编码后的视频数据。[0150]本技术一些实施例中,该装置还包括:判断模块;该判断模块,用于在对第i帧合成数据进行编码处理之前,判断是否满足第一条件,第一条件为当前时刻与目标采集时刻的差值小于或等于时长阈值,且当前处于视频录制状态;该编码模块,具体用于在满足第一条件的情况下,对第i帧合成数据进行编码处理;在不满足第一条件的情况下,丢弃第i帧合成数据。[0151]本技术一些实施例中,该装置还包括:检测模块;经过编码处理的第i帧合成数据包括时间戳,时间戳用于指示对第i帧合成数据进行编码处理的时刻与目标时刻的差值;该检测模块,用于在满足第一条件的情况下,检测当前是否处于数据合成状态;该编码模块,具体用于在当前处于数据合成状态的情况下,对第i帧合成数据进行编码处理,将第一差值与接收到录屏指令的系统时刻之和确定为目标时刻,第一差值为0,或者,第一差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值;在当前处于数据暂停状态的情况下,对第i帧合成数据进行编码处理,并将数据暂停状态切换为数据合成状态,将第二差值与接收到录屏指令的系统时刻之和确定为目标时刻,第二差值用于指示对第i帧合成数据进行编码处理的时刻与上一次从数据合成状态切换为数据暂停合成状态的时刻的差值。[0152]本技术一些实施例中,该装置还包括,切换模块;该检测模块,还用于在不满足第一条件的情况下,检测当前是否处于数据合成状态;该切换模块,用于在当前处于数据合成状态的情况下,将数据合成状态设置为数据暂停合成状态,记录当前将数据合成状态切换为数据暂停合成状态的时刻,并丢弃第i帧合成数据;在当前处于数据暂停合成状态的情况下,丢弃第i帧合成数据。[0153]本技术一些实施例中,在对第i帧合成数据进行编码处理,以生成编码后的视频数据之后,在按照目标倍速播放编码后的视频数据时,将时间戳与目标倍速的倒数的乘积作为播放第i帧合成数据与播放下一帧合成数据的时间间隔。[0154]本技术实施例中,各模块可以实现上述方法实施例提供的屏幕录制方法,且能达到相同的技术效果,为避免重复,这里不再赘述。[0155]如图13所示,本技术实施例还提供一种电子设备,该电子设备可以包括:处理器1301,存储器1302以及存储在存储器1302上并可在处理器1301上运行的程序或指令,该程序或指令被处理器1301执行时可以实现上述方法实施例提供的屏幕录制方法的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。[0156]本发明实施例提供还提供了一种计算机可读存储介质,该计算机可读存储介质上存储计算机程序,该计算机程序被处理器执行时实现上述屏幕录制方法执行的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。[0157]其中,该计算机可读存储介质可以为只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等。[0158]本发明提供一种计算机程序产品,包括:当所述计算机程序产品在计算机上运行时,使得所述计算机实现上述的屏幕录制方法。[0159]最后应说明的是:以上各实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述各实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的范围。[0160]为了方便解释,已经结合具体的实施方式进行了上述说明。但是,上述示例性的讨论不是意图穷尽或者将实施方式限定到上述公开的具体形式。根据上述的教导,可以得到多种修改和变形。上述实施方式的选择和描述是为了更好的解释原理以及实际的应用,从而使得本领域技术人员更好的使用所述实施方式以及适于具体使用考虑的各种不同的变形的实施方式。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1