掌桥专利:专业的专利平台
掌桥专利
首页

数据共享方法及装置

文献发布时间:2023-06-19 18:37:28


数据共享方法及装置

技术领域

本申请实施例涉及通信技术领域,特别涉及一种数据共享方法、装置、电子设备及计算机可读存储介质。

背景技术

不同的电子设备之间通过数据共享可以实现同步娱乐、监控等功能,具有广阔的应用前景。

目前,为了简化开发等,不同的电子设备之间数据共享基本是通过JAVA层实现的。

但是,通过JAVA层实现不同的电子设备之间数据共享,通常存在共享时延较大的问题。

发明内容

本申请实施例提供了一种数据共享方法、装置、电子设备及计算机可读存储介质,可以解决相关技术的不同的电子设备之间数据共享,时延较大的问题。所述技术方案如下:

第一方面,提供了一种数据共享方法,应用于第一电子设备,所述方法包括:

通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,并在所述第一C++层中与第二电子设备建立数据传输通道;

在所述第一C++层获取所述第一电子设备上的待共享数据;

在所述第一C++层将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

第二方面,提供了一种数据共享方法,应用于第二电子设备,所述方法包括:

与第一电子设备建立数据传输通道;所述数据传输通道为所述第一电子设备通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,在所述第一C++层中与所述第二电子设备建立;

通过所述数据传输通道,接收所述第一电子设备传输的待共享数据;所述待共享数据由所述第一电子设备在所述第一C++层从所述第一电子设备上获取。

第三方面,提供了一种数据共享装置,应用于第一电子设备,所述装置包括:

输出传输通道第一建立模块,用于通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,并在所述第一C++层中与第二电子设备建立数据传输通道;

待共享数据获取模块,用于在所述第一C++层获取所述第一电子设备上的待共享数据;

共享模块,用于在所述第一C++层将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

第四方面,提供了一种数据共享装置,应用于第二电子设备,所述装置包括:

输出传输通道第二建立模块,用于与第一电子设备建立数据传输通道;所述数据传输通道为所述第一电子设备通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,在所述第一C++层中与所述第二电子设备建立;

接收模块,用于通过所述数据传输通道,接收所述第一电子设备传输的待共享数据;所述待共享数据由所述第一电子设备在所述第一C++层从所述第一电子设备上获取。

第五方面,提供了一种电子设备,所述电子设备包括处理器和存储器;所述存储器存储有至少一条指令,所述至少一条指令用于被所述处理器执行以实现如第一方面,和/或,第二方面所述的数据共享方法。

第六方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如第一方面,和/或,第二方面所述的数据共享方法。

本申请实施例提供的数据共享方法中,通过第一电子设备的第一JAVA接口调用该第一电子设备的第一C++层,待共享数据的获取是通过比JAVA层更底层的第一C++层实现的,在获取共享数据的过程中跨越的代码层数较少,可以减少时延,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少获取待共享数据的时延。同时,待共享数据的传输也是在第一C++层实现的,在待共享数据的传输的过程中跨越的代码层数较少,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少待共享数据的传输过程的时延。综上所述,本申请可以明显减少数据共享过程中的时延。

附图说明

图1是本申请实施例提供的第一种数据共享方法的流程图;

图2是本申请实施例提供的第二种数据共享方法的流程图;

图3是本申请实施例提供的第三种数据共享方法的流程图;

图4是本申请实施例提供的一种数据共享装置的结构框图;

图5是本申请实施例提供的另一种数据共享装置的结构框图;

图6是本申请实施例提供的一种数据共享方法对应的系统结构图;

图7本申请实施例提供的一种RtspService的类图;

图8本申请实施例提供的一种RtspClient的类图;

图9是本申请实施例提供的一种数据共享的时序图;

图10是本申请实施例提供的一种暂停录屏的时序图;

图11是本申请实施例提供的一种第二电子设备的时序图;

图12是本申请实施例提供的一种第二电子设备的解析播放时序图;

图13是本申请实施例提供的一种第二电子设备的暂停播放时序图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。

在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。

为使本领域技术人员更好地理解本申请,以下对本申请涉及的术语概念进行说明:

第一电子设备:指具有芯片,能够通信的设备,第一电子设备具有第一JAVA层,支持JAVA语言,第一JAVA层与第一C++层兼容。第一电子设备可以包括计算机、具有芯片的车载中控屏幕等。例如,第一电子设备的操作系统可以为Android操作系统。

第二电子设备:也指具有芯片,能够通信的设备,第二电子设备具有第二JAVA层,支持JAVA语言,第二JAVA层与第二C++层兼容。第二电子设备独立于第一电子设备。例如,第一电子设备为车内具有芯片的前排车载中控屏幕,第二电子设备可以是该车内具有芯片的后排车载屏幕等。

数据传输通道:指用于传输或共享待共享数据的数据通路。

待共享数据:是指第一电子设备欲共享给第二电子设备的数据,待共享数据可以是图像、音频、文本等不限类别的数据。图像可以包括视频等。

在本申请实施例中,在第一电子设备的第一C++层获取待共享数据,并在第一C++层将待共享数据传输给第二电子设备,实现了第一电子设备向第二电子设备的数据共享。

更为具体的,发明人发现,现有技术中,通过JAVA层实现不同的电子设备之间数据共享,通常存在共享时延较大的问题的主要原因在于:现有技术中,主要采用的是MediaProjection meidacodec(Android原生截屏、录屏接口)进行录屏,采用meidacodec(Android原生编解码接口)编解码,这些Android原生接口都是JAVA层的接口,一方面,这些Android原生接口会跨越多层代码调用至底层,增加耗时,另一方面,这些Android原生接口都是基于JAVA语言编写,JAVA语言在代码执行效率方面较低,会增加耗时。

相较于现有技术中通过JAVA层实现不同的电子设备之间数据共享,本申请实施例通过第一电子设备的第一JAVA接口调用该第一电子设备的第一C++层,待共享数据的获取是通过比JAVA层更底层的第一C++层实现的,在获取共享数据的过程中跨越的代码层数较少,可以减少时延,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少获取待共享数据的时延。同时,待共享数据的传输也是在第一C++层实现的,在待共享数据的传输的过程中跨越的代码层数较少,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少待共享数据的传输过程的时延。综上所述,本申请可以明显减少数据共享过程中的时延。

参考图1,其示出了本申请实施例提供的第一种数据共享方法的流程图。

该方法包括:

步骤101,通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,并在所述第一C++层中与第二电子设备建立数据传输通道。

本申请实施例中,第一电子设备的JAVA层具有第一JAVA接口,该第一JAVA接口可以是JNI(Java Native Interface,JAVA本地接口),通过该第一JAVA接口调用第一电子设备的第一C++层,然后规定好数据端口、数据属性等,在第一电子设备的第一C++层中与第二电子设备建立数据传输通道。

步骤102,在所述第一C++层获取所述第一电子设备上的待共享数据。

待共享数据可以是第一电子设备想要共享给第二电子设备的任何类型的数据。第一电子设备的第一C++层可以设置有共享数据获取函数等,通过第一电子设备的第一C++层的共享数据获取函数等,获取第一电子设备上的待共享数据。

例如,第一电子设备为车内具有芯片的前排车载中控屏幕,第二电子设备为该车内具有芯片的后排车载屏幕,第一电子设备正在播放电影。该待共享数据可以为第一电子设备正在播放的内容。通过第一电子设备的第一C++层的共享数据获取函数,获取第一电子设备正在播放的内容。

步骤103,在所述第一C++层将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

在本申请实施例中,在获取了第一电子设备上的待共享数据之后,可以基于前述已经建立好的数据传输通道,将该待共享数据在第一电子设备的第一C++层通过该数据传输通道将该待共享数据传输给第二电子设备,实现了待共享数据向第二电子设备的共享。

例如,针对前述例子,第一电子设备正在播放电影。该待共享数据可以为第一电子设备正在播放的内容。通过该数据传输通道将该待共享数据传输给第二电子设备,实现了前后排屏幕同步播放一个电影,使得前后排乘客可以同步观看同一部电影。

本申请实施例具体可以应用的场景包括但不限于:

一种场景下,第一电子设备为车内具有芯片的前排车载中控屏幕,第二电子设备为该车内具有芯片的后排车载屏幕,第一电子设备正在播放视频,如电影。该待共享数据可以为第一电子设备正在播放的内容。在第一电子设备的第一C++层,获取第一电子设备正在播放内容,将其作为待共享数据,通过前述建立的数据传输通道,共享或传输给第二电子设备,实现前后排屏幕同步播放一个视频,使得前后排乘客可以同步观看同一视频。

另一种场景下,第一电子设备为该车内具有芯片的后排车载屏幕,第二电子设备为车内具有芯片的前排车载中控屏幕,在第一电子设备的第一C++层,获取第一电子设备的屏幕内容,将其作为待共享数据,通过前述建立的数据传输通道,传输给第二电子设备,实现前排车载中控屏幕对后排车载屏幕的监控,进而实现前排乘客对后排乘客在后排车载屏幕的操作监控。

另一种场景下,第一电子设备为该车内具有芯片的后排车载屏幕,第二电子设备为车内具有芯片的前排车载中控屏幕,第一电子设备连接有摄像头,该摄像头用于获取后排座位的图像信息,在第一电子设备的第一C++层,将摄像头录制的图像信息作为待共享数据,通过前述建立的数据传输通道,传输给第二电子设备,实现前排车载中控屏幕对后排座位,如后排乘客、后排宠物、后排行李的监控和监护,进而实现前排乘客对后排乘客、后排宠物、后排行李的监控和监护。

另一种场景下,第一电子设备为团队游戏中的一个电子设备,第二电子设备为该团队游戏中的另一个电子设备,在第一电子设备的第一C++层,获取第一电子设备的屏幕内容,将其作为待共享数据,通过前述建立的数据传输通道,共享或传输给第二电子设备,实现第二电子设备对第一电子设备的游戏界面的监控,提升游戏体验。

另一种场景下,第一电子设备为带摄像头的电子设备,第二电子设备为移动电子设备,该摄像头用于获取第一地理位置的图像信息,在第一电子设备的第一C++层,将摄像头录制的图像信息作为待共享数据,通过前述建立的数据传输通道,传输给第二电子设备,实现远程监控。

另一种场景下,第一电子设备和第二电子设备在物理空间上具有一定的距离,第一电子设备正在播放音频,如歌曲、通话。该待共享数据可以为第一电子设备正在播放的内容。在第一电子设备的第一C++层,获取第一电子设备正在播放内容,将其作为待共享数据,通过前述建立的数据传输通道,传输给第二电子设备,实现第一电子设备和第二电子设备同步播放一个音频,使得第二电子设备的用户和第一电子设备的用户可以同步收听同一音频。

综上所述,本申请实施例提供的数据共享方法中,通过第一电子设备的第一JAVA接口调用该第一电子设备的第一C++层,待共享数据的获取是通过比JAVA层更底层的第一C++层实现的,在获取共享数据的过程中跨越的代码层数较少,可以减少时延,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少获取待共享数据的时延。同时,待共享数据的传输也是在第一C++层实现的,在待共享数据的传输的过程中跨越的代码层数较少,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少待共享数据的传输过程的时延。综上所述,本申请可以明显减少数据共享过程中的时延。

参考图2,其示出了本申请实施例提供的另一种数据共享方法的具体步骤流程图,方法包括:

步骤201,通过所述第一电子设备的第一JAVA接口,调用所述第一电子设备的第一C++层的传输协议函数。

第一电子设备的第一C++层的传输协议函数是第一电子设备的第一C++层中支持特定传输协议的传输协议函数。例如,该传输协议函数可以为支持UDP(User DatagramProtocol,用户数据报协议)传输协议函数。

步骤202,所述第一C++层的传输协议函数与所述第二电子设备,建立与所述传输协议函数匹配的数据传输通道。

该第一C++层的传输协议函数与第二电子设备通过多次握手等,建立与该传输协议函数匹配的数据传输通道。此处的与该传输协议函数匹配的数据传输通道具体是指该数据传输通道支持前述的传输协议。例如,前述的传输协议函数若为UDP传输协议函数,则建立的数据传输通道支持UDP,为UDP数据传输通道。

步骤203,所述第一C++层的传输协议函数在所述第一C++层的共享数据获取函数中,注册回调函数。

共享数据获取函数可以根据待共享数据的属性等设置。例如,在第一C++层可以通过screenrecord函数,获取第一电子设备的屏幕内容。在获取待共享数据的过程中,采用回调函数可以提升编程效率,简化开发难度。

步骤204,所述第一C++层的共享数据获取函数获取所述第一电子设备上的待共享数据。

步骤205,所述第一C++层的共享数据获取函数将所述待共享数据,通过所述回调函数返回给所述第一C++层的传输协议函数。

步骤206,所述第一C++层的传输协议函数将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

可选的,前述步骤201可以包括:通过前述第一JAVA接口调用第一电子设备的第一C++层的RTSP(Real Time Streaming Protocol,实时流传输协议)传输协议函数。可选的,前述步骤202可以包括:第一C++层的RTSP传输协议函数与第二电子设备,建立RTSP数据传输通道,RTSP数据传输通道具有传输延时小的特点,可以进一步减少延时。

可选的,该建立RTSP数据传输通道的步骤可以包括:第一C++层的RTSP传输协议函数与第二电子设备,建立最大消息长度大于或等于20280字节的RTSP数据传输通道,RTSP数据传输通道以数据包方式,将待共享数据发送至第二电子设备,此处的最大消息长度具体是指该RTSP数据传输通道中传输的单个的数据包的最大字节数,就是说,该RTSP数据传输通道中传输的单个数据包的最大字节数可以大于或等于20280字节。相对于现有技术中,数据传输通道的最大消息长度为1400字节左右而言,本发明增了最大消息长度,进而可以减少分包发送的次数,进而可以大幅度降低时延。

可选的,前述步骤203可以包括:第一C++层的传输协议函数在第一C++层的屏幕录制函数中,注册回调函数,就是说此处的待分享数据与第一电子设备的屏幕紧密相关,该第一C++层的共享数据获取函数为C++层的屏幕录制函数。可选的,前述步骤204可以包括:第一C++层的屏幕录制函数捕获第一电子设备的屏幕信息,并编码,得到待共享数据。第一电子设备的屏幕信息可以为第一电子设备屏幕上当前显示的内容。此处的编码与该屏幕信息相对应,是为了将该屏幕信息通过的数据传输通道,传输给第二电子设备所做的编码。例如,若第一电子设备屏幕上当前显示的内容为播放电影,此处的编码即为将获取的屏幕信息编码为H264或H265流数据。

此处的编码可以使用第一C++层的Mediacodec,相对于JAVA层的Mediacodec而言,一方面第一C++层的Mediacodec更底层,编解码跨越的代码层少,另一方面C++语言代码执行效率高。更为具体的,MediaCodec是Android中的编解码器组件,用来访问底层提供的编解码器,硬件加速解码和编码,主要优点在于有适配度高、编解码数据快、省电等。

可选的,此处第一C++层的屏幕录制函数捕获第一电子设备的屏幕信息,并编码,得到待共享数据,可以包括:第一C++层的屏幕录制函数创建虚拟屏,并将第一电子设备的屏幕信息映射到该虚拟屏上,该虚拟屏将其上的屏幕信息捕获到编码器,该编码器将该屏幕信息进行编码。编码器可以设置编码参数,通过不断测试将编码参数,如比特率、帧率、i帧间隔、码率模式等设置为合适值,进而保证画面质量,并且降低编码数据大小,减小数据传输延迟率。

可选的,前述步骤205可以包括:第一C++层的屏幕录制函数将第一电子设备的待共享数据,通过前述回调函数返回给第一C++层的传输协议函数,采用回调函数可以提升编程效率,简化开发难度。

可选的,前述步骤206可以包括:第一C++层的RTSP传输协议函数将待共享数据,通过RTSP数据传输通道,传输给第二电子设备,RTSP数据传输通道具有传输延时小的特点,可以进一步减少延时。

可选的,前述将待共享数据通过RTSP数据传输通道,传输给第二电子设备,可以包括:第一C++层的RTSP传输协议函数将上述待共享数据,通过最大消息长度大于或等于20280字节的RTSP数据传输通道,传输给第二电子设备,扩大了最大消息长度,进而可以减少分包发送的次数,进而可以大幅度降低时延。

可选的,第一电子设备连接有摄像头,前述步骤102可以包括:在第一电子设备的第一C++层,打开第一设备连接的摄像头,并获取该摄像头拍摄的图像数据,然后将该摄像头拍摄的图像数据通过前述数据传输通道,传输给第二电子设备,进而实现低时延的监控。

本申请还提供一种数据共享方法,应用于前述的第二电子设备,参照图3所示,该方法可以包括如下步骤:

步骤301,与第一电子设备建立数据传输通道;所述数据传输通道为所述第一电子设备通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,在所述第一C++层中与所述第二电子设备建立。

步骤302,通过所述数据传输通道,接收所述第一电子设备传输的待共享数据;所述待共享数据由所述第一电子设备在所述第一C++层从所述第一电子设备上获取。

该数据共享方法与前述的应用于第一电子设备上的数据共享方法,具有相同或相似的有益效果。在获取到待共享数据后,如果是编码后的数据,则可以采用与编码对应的解码规则,进行解码。针对视频、音频数据在第二电子设备上播放即可。针对图片、文本信息等,在第二电子设备上显示即可。

可选的,前述步骤301可以包括:该第二电子设备通过其第二JAVA接口调用到其上的第二C++层,并在第二C++层中与第一电子设备建立该数据传输通道,同样的,该待共享数据的接收是在第二C++层实现的,在接收待共享数据的过程中跨越的代码层数较少,可以减少时延,且第二C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少接收待共享数据的时延。

可选的,前述步骤302之前,该方法还可以包括:创建网络数据缓冲区以及输出缓冲区,就是在第二电子设备中做了双缓冲,网络数据缓冲区用于保证共享数据不会被覆盖或冲掉。该步骤302可以包括:通过前述数据传输通道,将前述待共享数据先存储至网络数据缓冲区中并解析,再将解析后的待共享数据从网络数据缓冲区加载至输出缓冲区,相对于现有技术,待共享数据直接接收至输出缓冲区而言,网络数据缓冲区提供了待共享数据的初步存储空间,且替代输出缓冲区进行数据解析,输出缓冲区的任务量减少,能够提升待共享数据在第二电子设备上的展示速度,进而减少了时延。此处的解析主要是指,将数据包的包头等用于传输的部分去掉。

参考图4,其示出了本申请实施例提供的一种数据共享装置的结构框图,应用于第一电子设备,该装置包括:

输出传输通道第一建立模块401,用于通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,并在所述第一C++层中与第二电子设备建立数据传输通道;

待共享数据获取模块402,用于在所述第一C++层获取所述第一电子设备上的待共享数据;

共享模块403,用于在所述第一C++层将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

可选的,输出传输通道第一建立模块401包括:

调用子模块,用于通过所述第一电子设备的第一JAVA接口,调用所述第一电子设备的第一C++层的传输协议函数;

输出传输通道第一建立子模块,用于所述第一C++层的传输协议函数与所述第二电子设备,建立与所述传输协议函数匹配的数据传输通道;

待共享数据获取模块402包括:

注册子模块,用于所述第一C++层的传输协议函数在所述第一C++层的共享数据获取函数中,注册回调函数;

待共享数据第一获取子模块,用于所述第一C++层的共享数据获取函数获取所述第一电子设备上的待共享数据;

回调子模块,用于所述第一C++层的共享数据获取函数将所述待共享数据,通过所述回调函数返回给所述第一C++层的传输协议函数;

共享模块403包括:

共享子模块,用于所述第一C++层的传输协议函数将所述待共享数据,通过所述数据传输通道,共享给所述第二电子设备。

可选的,注册子模块包括:

注册单元,用于所述第一C++层的传输协议函数在所述第一C++层的屏幕录制函数中,注册回调函数;

待共享数据获取子模块,包括:

待共享数据获取单元,用于所述第一C++层的屏幕录制函数捕获所述第一电子设备的屏幕信息,并编码,得到所述待共享数据;

回调子模块,包括:

回调单元,用于所述第一C++层的屏幕录制函数将所述第一电子设备的所述待共享数据,通过所述回调函数返回给所述第一C++层的传输协议函数。

可选的,调用子模块,包括:

调用单元,用于通过所述第一JAVA接口调用所述第一电子设备的第一C++层的RTSP传输协议函数;

输出传输通道第一建立子模块,包括:

输出传输通道第一建立单元,用于所述第一C++层的RTSP传输协议函数与所述第二电子设备,建立RTSP数据传输通道;

共享子模块,包括:

共享单元,用于所述第一C++层的RTSP传输协议函数将所述待共享数据,通过所述RTSP数据传输通道,共享给所述第二电子设备。

可选的,输出传输通道第一建立单元,包括:

输出传输通道建立子单元,用于所述第一C++层的RTSP传输协议函数与所述第二电子设备,建立最大消息长度大于或等于20280字节的RTSP数据传输通道;

共享单元,包括:

共享子单元,用于所述第一C++层的RTSP传输协议函数将所述待共享数据,通过最大消息长度大于或等于20280字节的所述RTSP数据传输通道,共享给所述第二电子设备。

可选的,待共享数据获取单元,包括:

映射子单元,用于所述第一C++层的屏幕录制函数创建虚拟屏,并将所述第一电子设备的屏幕信息映射到所述虚拟屏上;

捕获子单元,用于所述虚拟屏将所述屏幕信息捕获到编码器;

编码子单元,用于所述编码器将所述屏幕信息进行编码。

可选的,待共享数据获取模块402包括:

待共享数据第二获取子模块,用于在所述第一C++层,打开所述摄像头,并获取所述摄像头拍摄的图像数据。

参考图5,其示出了本申请实施例提供的另一种数据共享装置的结构框图,应用于第二电子设备,该装置包括:

输出传输通道第二建立模块501,用于与第一电子设备建立数据传输通道;所述数据传输通道为所述第一电子设备通过所述第一电子设备的第一JAVA接口调用到所述第一电子设备的第一C++层,在所述第一C++层中与所述第二电子设备建立;

接收模块502,用于通过所述数据传输通道,接收所述第一电子设备传输的待共享数据;所述待共享数据由所述第一电子设备在所述第一C++层从所述第一电子设备上获取。

可选的,输出传输通道第二建立模块501,包括:

输出传输通道第二建立子模块,用于通过所述第二电子设备的第二JAVA接口调用到所述第二电子设备的第二C++层,并在所述第二C++层中与所述第一电子设备建立所述数据传输通道。

可选的,所述装置还包括:

缓冲区创建模块,用于创建网络数据缓冲区以及输出缓冲区;

接收模块502,包括:

接收子模块,用于通过所述数据传输通道,将所述待共享数据先存储至所述网络数据缓冲区中并解析,再将解析后的待共享数据从所述网络数据缓冲区加载至所述输出缓冲区。

下面结合具体的实施例,再进一步解释说明本发明。

实施例

本实施例的应用场景为第一电子设备将其屏幕信息,共享或传输至第二电子设备,实现数据共享。

参考图6,其示出了本申请实施例提供的一种数据共享方法对应的系统结构图,参照图6所示,该方法可以适应于多个需要用到数据共享的应用,该方法提供了与各种应用的接口即Mulit-DisplayInteractive API(多屏互动对外接口),其主要通过MulitDisplayInteractiveManager(多屏互动接口管理模块)实现。此处的各种应用具体是指用到数据共享方法的应用。Mulit-DisplayInteractive Service(多屏互动主服务)分为:Mulit-DisplayInteractive Service(多屏互动主服务模块)、MultiDisplayInteractiveServiceImpl(投屏显示模块)、MirrorDisplayViewControler(投屏画面管理模块)、MultiDisplayJniService(投屏调用接口)组成。Mulit-DisplayInteractive Service主要用于与需要用到数据共享的应用创建关联。该MirrorDisplayViewControler主要用于管控每一个屏幕中的投屏画面,以及跨芯片投屏逻辑处理。MultiDisplayJniService具体是多芯片投屏调用RtspService(rtsp传输服务)以及rtspClient(rtsp客户端)服务的jni接口。RtspService由screenCordServer(投屏服务端Jni接口类)、RtspServiceMain(第一C++层的传输协议函数)、rtp(投屏服务发送类)、screenrecord(第一C++层的屏幕录制函数)组成。RtspServiceMain主要用于与第二电子设备建立数据传输通道,并将待共享数据基于该数据传输通道传输至第二电子设备。rtp类主要用于将待共享数据封装为数据包,并将数据包传输至第二电子设备。screenrecord主要用于录制第一电子设备的屏幕信息,并编码,如编码为H264流。Mulit-DisplayInteractive API、Mulit-DisplayInteractive Service、RtspService运行于第一电子设备,且Mulit-DisplayInteractive Service、RtspService运行在第一电子设备的第一C++层。RtspClient(投屏客户端)由screenCordClient(投屏客户端Jni接口类)、RtspClientMain(投屏客户端主服务类)、avplayer(投屏客户端解码播放类)、com_net(投屏客户端网络连接类)、rtspClient(投屏客户端rtsp传输协议连接类)、rtpClient(投屏客户端rtp传输协议连接类)、cH264RTP(投屏客户端rtp解析类)、rtpParse(投屏客户端rtp解析抽象类)、core_jni_helpers(Jni的工具类)、com_queue(投屏客户端的队列封装类)、rtspProtocol(投屏客户端rtsp协议类)、com_debug(投屏客户端log工具类)组成。RtspClientMain主要用于与第一电子设备或服务端建立连接,并且将第一电子设备或服务端传输的待共享数据,如H264流数据进行解码播放。avplayer主要将由第一电子设备或服务端传输过来的H264、H265流数据使用MediaCodec进行解码播放。com_net主要用于提供udp tcp连接,并且接收第一电子设备或服务端传输来的待共享数据。rtspClient主要负责与第一电子设备或服务端建立RTSP数据传输通道。rtpClient主要负责与第一电子设备或服务端建立连接。cH264RTP主要用于负责第一电子设备或服务端传输来的rtp数据包进行分片解析。rtspProtocol主要用于解析rtsp协议。RtspClient运行于第二电子设备。

参考图7,其示出了本申请实施例提供的一种RtspService的类图,参照图7所示,screenCordServer被调用后,RtspServiceMain会在screenrecord中注册回调函数,screenrecord录制第一电子设备的屏幕信息,并编码,得到待分享数据,然后通过该回调函数返回给RtspServiceMain,RtspServiceMain通过已经建立的数据传输通道将该待分享数据传输给第二电子设备。

图8是本申请实施例提供的一种RtspClient的类图,图9是本申请实施例提供的一种数据共享的时序图。参照图7、图8、图9所示,第一步,MultiDisplayJniService首先通过Jni调用到C++层screenCordServer初始化第一电子设备函数,等待第二电子设备与第一电子设备建立连接通信。第二步,第一电子设备与第二电子设备建立连接通信后,MultiDisplayJniService调用C++层api_StartScreenCordServer函数来进行RTSP数据传输通道建立。RTSPRTSP数据传输通道建立过程中,第一电子设备流程主要是OPTIONSDESCRIBE SETUP PLAY TEARDOWN方法。

OPTIONS:获取第一电子设备支持的接口Server->Client,第一电子设备回复第二电子设备,消息中包含当前可用的方法。

DESCRIBE:获取直播流媒体信息Server->Client,第一电子设备回复第二电子设备sdp文件,该文件告诉第二电子设备,第一电子设备有哪些音视频流,有什么属性,如编解码器信息,帧率等。

SETUP:告知第一电子设备需要建立对应媒体数据传输通道Client->Server,第一电子设备收到第二电子设备请求后,根据第二电子设备请求的端口号确定发送控制数据的端口以及音视频数据的端口。

PLAY:开始播放Client->Server第一电子设备回复第二电子设备200OK!之后开始通过SETUP中指定的端口开始发送数据。

TEARDOWN:结束Client->Server第一电子设备收到消息后,向第二电子设备发送200OK,之后断开连接。

第一电子设备与第二电子设备建立好RTSP数据传输通道后开始进行屏幕信息录制并且传输。

具体的,RtspServiceMain注册screenrecord的回调函数,screenrecord会将录制出的屏幕信息编码为h264流回调给RtspServiceMain,RtspServiceMain调用rtp的rtpSendPacket方法将h264流打包成rtp包发送给第二电子设备,修改rtp包最大消息长度,将每次发送rtp包最大消息长度由1400字节修改成1024×20字节,减小h264流数据分包发送次数,降低待分享数据发送延迟。

screenrecord录制屏幕信息,并编码主要如下:screenrecord类创建虚拟屏,将主屏的内容映射到虚拟屏上,虚拟屏捕获主屏幕数据buff到编码器,编码器设置编码参数,通过不断测试将编码参数,如比特率、帧率、i帧间隔、码率模式等,设置合适值,保证画面质量,并且降低编码数据大小,减小数据传输延迟率,然后将输出的h264流数据回调给RtspServiceMain。

图10是本申请实施例提供的一种暂停录屏的时序图。参照图10所示,MultiDisplayJniService首先通过Jni调用到C++层screenCordServer暂停第一电子设备录屏函数。screenCordServer暂停录屏函数调用到RtspServiceMain中的api_StopScreenCordServer方法,再调用到screenrecord的stop方法停止屏幕录制。screenrecord屏幕录制类里解码是循环进行,stop方法主要是停止解码的循环,再释放MediaCodec编解码器组件。

图11是本申请实施例提供的一种第二电子设备的时序图。参照图11所示,MultiDisplayJniService首先通过Jni调用到C++层screenCordClient初始化第二电子设备函数,与第一电子设备建立连接通信。接着,RtspClientMain调用rtspClient的api_init方法主要开始与第一电子设备建立RTSP数据传输通道,具体为:首先调用com_net的tcp_net_connect方法进行tcp连接,连接成功后进行RTSP交互逻辑。第二电子设备基本流程是OPTIONS DESCRIBE SETUP PLAY TEARDOWN方法。

OPTIONS:获取第一电子设备支持的接口Client->Server第二电子设备向第一电子设备发送OPTIONS,请求可用的方法。

DESCRIBE:获取直播流媒体信息Client->Server第二电子设备向服务器请求媒体描述文件,一般通过rtsp开头的url来发起请求,格式为sdp。

SETUP:告知第一电子设备需要建立对应媒体数据传输通道Client->Server第二电子设备向第一电子设备发起建立连接请求,请求建立会话连接,准备开始接收音视频数据,请求信息描述了期望音视频数据包基于UDP还是TCP传输,指定了RTP,RTCP端口,以及是单播还是组播等信息。

PLAY:开始播放Client->Server第二电子设备向第一电子设备请求播放媒体。

TEARDOWN:结束Client->Server结束播放的时候,第二电子设备向第一电子设备发起结束请求。

在第二电子设备RTSP数据传输通道建立通信后,开始调用rtsp_start方法,创建两个线程,循环接收第一电子设备发送的rtp包并将rtp包传输值队列中,创建网络数据缓冲区以及h264输出缓冲区,待共享数据接收后,先存到网络数据缓冲区,再取出保存到h264输出缓冲区,网络数据缓冲区预留100ms缓冲,保证最大接收延迟率在100ms以内,优化延迟率。

图12是本申请实施例提供的一种第二电子设备的解析播放时序图。参照图12所示,MultiDisplayJniService通过Jni调用到screenCordClient类中,从而调用RtspClientMain的api_StartScreenCordClient方法。RtspClientMain的api_StartScreenCordClient方法首先会调用avplayer.InitVideo方法,配置了Mediacodec解码参数并且新起线程不断解析h264流数据。avplayer.InitVideo方法执行成功后,RtspClientMain会创建一个循环来不断调用rtspClient.api_requestFrameBuffer方法来获取缓存队列的h264流数据,获取到的数据在添加到VideoBuffer中。数据存储到videoBuffer后会循环调用SearchStartCode方法来寻找开始帧,开始帧找到后avplayer.FeedOneH264Frame会将每次的数据输入到输入流队列,输入完后会清除videoBuffer中的这次的数据,然后释放从缓存队列的h264流数据。

图13是本申请实施例提供的一种第二电子设备的暂停播放时序图。参照图13所示,MultiDisplayJniService通过Jni调用到screenCordClient类中,调用RtspClientMain的api_DeleteScreenCordClient方法,主要是调用avplayer类的Dispose方法来停止第二电子设备对接收数据的解码播放。avplayer类的Dispose方法主要是停止不断解码播放的线程,avpalyer类中为了解码播放第二电子设备接收的h264流数据新起了一个线程专门做解码播放操作。

本实施例中,该方案将数据共享集成在系统服务中,对外提供调用接口,其他服务及应用可直接调用,不用关心具体实现,提高了上层代码的开发效率,简化开发流程,复用性高。

对比例

第一电子设备在JAVA层采用Android原生截屏、录屏接口MediaProjection对第一电子设备的屏幕信息进行录屏,采用Android原生编解码接口meidacodec编码,得到待分享数据,然后在JAVA层将待分享数据传输至第二电子设备。

延迟统计均采用毫秒表级的计时器进行统计,对实施例分别采用时隔1s统计一次以及时隔3秒统计一次进行统计,统计结果见下表1。

表1:实施例延时统计表

表1中,实施例的平均延迟率分别为64.9ms以及66.818ms延迟率优化至65ms左右。对对比例也采用时隔1s统计一次以及时隔3秒统计一次进行统计,平均延迟率分别为320.2ms以及300.7ms,延迟率大于300ms。

相对于对比例,该实施例的低延迟率明显较低,具体原因在于:本申请实施例通过第一电子设备的第一JAVA接口调用该第一电子设备的第一C++层,待共享数据的获取是通过比JAVA层更底层的第一C++层实现的,在获取共享数据的过程中跨越的代码层数较少,可以减少时延,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少获取待共享数据的时延。同时,待共享数据的传输也是在第一C++层实现的,在待共享数据的传输的过程中跨越的代码层数较少,且第一C++层的代码执行效率明显快于JAVA层的代码执行效率,可以减少待共享数据的传输过程的时延。而且,实施例中,RTSP数据传输通道中传输的单个数据包的最大字节数为20280字节,减少了分包发送的次数,可以降低时延。因此,本申请提供了稳定、低延迟的数据共享解决方案,解决现阶段数据共享中多屏交互困难的问题。

本申请实施例还提供了一种计算机可读介质,该计算机可读介质存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现如上各个实施例所述的数据共享方法。

本申请实施例还提供了一种计算机程序产品,该计算机程序产品存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现如上各个实施例所述的数据共享方法。

本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。计算机可读介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。

以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

技术分类

06120115629752