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

一种跨平台视频通信方法

文献发布时间:2023-06-19 15:47:50



技术领域

本发明涉及视频通信技术领域,尤其涉及一种跨平台视频通信方法。

背景技术

当前视频通信已经成为了人们工作、生活中必不可少的交流方式。随着科技的发展,产生出了大量不同类型的智能硬件,包括但不限于电脑、手机、智能眼镜。由于功能、安全等方面的需求又衍生出不同平台,包括但不限于Windows,UWP,安卓,iOS,鸿蒙等。如何进行跨平台的视频通信是一个重要问题。

现有技术中,跨平台的视频通信通常有两种方式:

一、分别处理

在每种参与视频通信的源端设备中都基于自身的硬件和平台开发一套采集视频数据的程序然后将视频数据进行发送,终端根据源端的数据标准进行解压。这种方式虽然能够解决硬件性能压力问题,但是有重大缺陷:

(1)开发周期极其漫长:每个参与的平台都要独立开发一套采集视频数据的系统,相互协调对方的数据标准,可能在解码时还需要集成发送方的插件,无论技术对接还是商务协调都很漫长;

(2)维护困难:参与其中的一个平台技术更新时,其它平台都要重新对接新的技术标准;

(3)埋藏隐患:不同的接口及数据格式在压缩、传输、接收、解压环节都可能因为技术方案不统一而导致的兼容性问题,很难排查修复;

(4)开发成本高:开发周期、技术沟通、商务沟通都会产生很高的成本;

(5)不利于扩展:当视频通信中需要加入新的平台时,需要再次开发并协调每个参与方的技术标准;

(6)AR/MR智能眼镜中要发送的全息图像无法灵活调整:从硬件和系统层面采集全息图像的方式每个厂家各有不同,如果想要调整全息图像中现实图像与实际图像的偏差值或者颜色等非常困难。

二、通过引擎内置接口处理

通过引擎(例如虚幻、Unity)的内置截图方法将图像处理后传输,让连续的图像接替显示成为视频。这种方式虽然能快速跨平台开发,但问题同样明显:

(1)性能很差:跨平台引擎的内置截图方法是通过CPU进行实现的,由于本身的目的并非为视频通信开发,所以高频率的截图硬件性能会大幅下降。会导致主线程卡顿,整体软件图像卡顿,影响同程序中其他功能的运行;

(2)维护困难:引擎中提供的内置截图方法是固定的,仅具备少量可配置参数,无法灵活的调整其中的算法和流程;

(3)AR/MR智能眼镜中要发送的全息图像无法灵活调整:这种方法中目前基本都是直接将截取后的现实图像与虚拟图形叠加,偏差较大,不易调整。

综上所述,传统的跨平台的视频通信方式存在三种问题:(1)跨平台开发效率低,给开发者造成了极大困难。(2)造成极大的性能压力,导致卡顿或死机。(3)AR/MR智能眼镜传输时采集合成的全息图像偏差大。

尤其是当需要参与视频通信的设备中有AR/MR技术领域中的智能眼镜时,这些问题尤其突出。其中包含两个重要因素:

(1)智能眼镜设备需要佩戴在用户头上,体积必须小,导致其所搭载的CPU 及GPU等运算单元体积也很小,运算性能低;

(2)佩戴智能眼镜的用户视野中看到的图像包括两部分,一部分是通过透明镜片看到的现实图像,另一部分是由智能眼镜呈现叠加入视野的虚拟图像。在视屏传输时就需要同时采集现实图像和虚拟图像进行校准、合成,流程更加复杂,运算量更大。

因此,如何避免对每种不同的平台都进行一次独立的开发;减轻对硬件设备的性能压力,避免设备卡顿、死机等严重问题的发生;可以根据不同设备技术特性及功能动态切换所传输的图像;提高图像合成时虚拟图像与现实图像的匹配准确度;提高图像数据在网络传输中的效率,开发一款跨平台视频通信方法是领域技术人员急需解决的技术问题。

发明内容

本发明拟解决的技术问题是,提供一种跨平台视频通信方法,该视频通信方法利用Compute Shader技术使用GPU执行,使用大量运算单元进行并行计算,大幅提高整体运算速度与性能,在引擎中将源端视频数据流化,并将源端数据流通过网络传输到终端,最后在终端解码还原源端视频画面,支持将AR/MR等技术中的多个画面内容进行高性能融合,为网络传输减轻了带宽方面的负担,同时提供了可扩展空间。

一种跨平台视频通信方法,包括以下步骤:

S1、图像采集;

S2、图像校准,包括S21、校准像素比例和S22、校准偏移位置;

S3、图像合成;

S4、图像压缩;

S5、图像传输,将S4中压缩的图像信息发送给服务器,再由服务器发送给指定的客户端;

S6、图像解压和显示。

优选的,所述S1包括;

S11、采集现实图像,利用摄像头获取图像,在引擎中创建一个纹理T1,用纹理T1接受摄像头获取的图像信息;

S12、采集虚拟图像,在引擎中创建虚拟摄像机和纹理T2,虚拟摄像机的视角方向及位置与摄像头的空间映射位置一致、同步;用纹理T2接受虚拟摄像机获取的虚拟图像信息。

优选的,所述S21中设置一个缩放系数Scale,在T1图像内容不变的情况下将T1图像原始像素数量乘以Scale得到T1a。

优选的,所述S22包括以下步骤:

S221、创建一个Compute Shader A;

S222、在A中定义内核函数C;

S223、设置C中每个线程组中的线程为(8,8,1);这个设置方法在进行逐像素操作校准和后续JPEG算法压缩时都能极大的提高效率。

S224、在用CPU代码调用C的时候,设置C中线程组,结合S223中设置的线程数量,确保每个像素都有一个线程去进行处理;该步骤能最大化利用GPU多线程优势。

定义C在x位置上线程组的数量为Cx;

定义C在y位置上线程组的数量为Cy;

定义C在z位置上线程组的数量为1;

Cx=(T2横坐标上像素数量+7)/8;

Cy=(T2 纵坐标上像素数量+7)/8;

上述公式中“+7”是因为要让一个方向上的像素必定有一个线程可以与之对应,大于7浪费,小于7则可能会少设置一个线程组导致有像素纹理无法被调用。

以(Cx,Cy,1)来对C中线程组进行设置;

将T1a传递给A,在A中以2D纹理t1进行接收;

将T2传递给A,在A中以2D纹理t2进行接收;

在C中定义获取线程唯一标识符DTid为二维数组,DTid可以直接通过ComputeShader的自身机制获取到;

以t2为基准对t1的像素进行横向和纵向的移动进行校准;

t1需要在横向移动的值定义为t1x;

t1需要在纵向移动的值定义为t1y;

定义2D纹理t3用来接收校准后的t1;

t3= t1 [ DTid.x + t1x,DTid.y + t1y ]。

优选的,所述S3中定义2D纹理t4用来接收合成后的全息图像;

t4=t2[DTid].rgb*t2[DTid].a+ t3.rgb*(1-t2[DTid].a)。

优选的,所述S4中将t4的RGB颜色形式转换为YUV的颜色形式;在A中创建三个可共享内存的数组:D1、D2、D3;每个数组的容量为64;将YUV数据中的三个分量分别保存到D1、D2、D3中;

在C中定义获取线程标识符为Tid为二维数组,Tid可以直接通过Compute Shader的自身机制获取到;

在C中定义获取线程组标识符为Gid为二维数组,Gid可以直接通过ComputeShader的自身机制获取到;

因为不同平台GPU对数据分组顺序不同,需要把一个8*8的二维数组校准为按照从左往右,从上到下的顺序展开的一维数组;

定义当前像素位置对应与这个一维数组中的序号为ix1;

则ix1=(校准后的Tid.y)*8+Tid.x;

例,在设备Hololens中通过(7-Tid.y)的方式进行校准。

ix1=(7-Tid.y)*8+ Tid.x;

定义2D纹理t5用来接收转化为YUV颜色形式的数据;

t5=t4[Tid+Gid*8].rgb*255

用D1,D2,D3分别储存t5对应序号像素的YUV值

D1[ix1]=t5.y

D2[ix1]=t5.u

D3[ix1]=t5.v

等待线程组任务完成后,以组为单位完成FDCT计算与量化;对D1,D2,D3进行离散余弦变换(FDCT)操作,变换公式如下:

待线程组任务完成后,定义D1,D2,D3中数据位置的序号为ix2;

则获取ix2序号的方式为:Tid.y*8+Tid.x;

全部YUV值经过FDCT计算及量化后的图像数据为t6,t6中像素的序号为dx,t6依次对每个线程组中计算得到的D1,D2,D3进行储存;

将整张图像数据转化为储存三维数据的一维数组;

dx为整张图像的像素序号

dx= (((t2的纵向像素值/8-Gid.y-1)* (t2的横向像素值/8)+Gid.x)*64)+ix2

t6[dx].y=D1[ix2]

t6[dx].u=D2[ix2]

t6[dx].v=D3[ix2]

把t6从Compute Shader中返回给CPU,使用CPU多线程进行AC/DC编码;

设置一个整数数组Z记录ZigZag编码索引序号。设置标准的哈夫曼表,寻址表,量化表;

开启一个内存流B1

开启一个线程,

把t6分为每64个数据一组,这样每组称为一个数据元,对数据元进行ZigZag扫描;

创建整数型数组DU,定义其中元素数量为64;

用DU记录一组8*8 的ZigZag扫描后数据元素,改变其排列顺序方便后续AC编码。

对数据元中的每个元素,如果该元素是Y,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的Y,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].Y

对数据元中的每个元素,如果该元素是U,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的U,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].U

对数据元中的每个元素,如果该元素是V,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的V,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].V

计算完一个数据元后,这个数据元中64个数据的ZigZag计算完成;

对DU中第一个数据的编码过程叫DC编码;

设置本数据元的DC差值为Diff等于本次的DC减去上一个数据元的DC;

如果Diff为0,使用哈夫曼表计算出的编码表第一个值写入字节流;

如果Diff不为0,根据哈夫曼表计算出的编码表寻找相对应Diff的值写入字节流;

DC编码后进行AC处理:

把编码后的JPEG格式数据储存入内存流B1中;

当该图像所有数据元循环处理完成后,在B1中进行数据对齐,写入数据尾;

为了节省数据,通过编码解码对应的方式,省去数据头的写入;

从B1中获取到字节数组B2,

在B2中加入图像中的配置数据,包括图像宽、高,图像质量;

将B2通过UDP发送给服务器,再由服务器发送给指定的接收端。

优选的,所述S6是将S4中的数据B2根据S4的步骤反向进行操作,还原图像为以RGB顺序循环排列的一维数组数据t7;在引擎中设置渲染纹理t8,将数据t7传入t8中显示为图像。

优选的,所述S6中,将t8中显示的图像与源端用户实际在设备中看到的图像相比较,根据肉眼观察如两者内容有偏差,则返回到S2并调整缩放系数Scale、移动值t1x和t1y,直至t8中显示的图像与源端用户实际在设备中看到的图像无偏差或偏差可接受。

优选的,所述S5是将S4中压缩的图像信息通过UDP发送给服务器,再由服务器发送给指定的客户端。

本发明采用以上技术方案,与现有技术相比,具有以下优点:

本发明可以应用于同类型平台间的视频通信,也可以用于不同类型平台间的视频通信,避免对每种不同的设备或平台都进行一次独立的开发。尤其是需要在不同类型平台之间进行视频通信时,本发明的部署速度与传统方式相比有极大的优越性。既能减轻获取图像、合成图像、压缩图像时对设备的运行压力,又有效避免设备卡顿及死机等严重问题的发生。

下面结合附图和实施例对本发明进行详细说明。

附图说明

附图1为本发明一种跨平台视频通信方法的流程图。

具体实施方式

下面将结合说明书附图和具体的实施例对本发明所述的一种跨平台视频通信方法做进一步的详细说明。

为了便于说明而不是用于限定,对下文中用到的多个名词释义如下:

引擎:开发软件,尤其是开发3D软件时使用的开发软件,目前全球范围内应用最广的开发引擎为Unity,虚幻(UE)。

AR:增强现实。MR:混合现实。

纹理:引擎内部记录图像的一种数据形式,由横向和纵向的像素组成,每个像素由RGBA四个值构成,也可以只调取其RGB三个值。

图像数据压缩:指为减小网络传输数据量而对图像颜色数据进行压缩的方式,一般使用JPEG。

CPU:中央处理器(central processing unit,简称CPU)作为计算机系统的运算和控制核心,擅长逻辑判断运算。

GPU:图形处理器(英语:graphics processing unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片。

Compute Shader: Compute Shader是一种技术,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其它的运算能力,也就是GPGPU的概念和物理加速运算。Unity,虚幻等引擎中都具备Compute Shader的支持,可以在这些引擎中使用这一技术。

Compute Shader的线程组:GPU中计算不仅可以实现上千级的线程计算方式,还能实现各个线程划分小组进行计算,每个小组内的线程可以共享数据。使用线程组时用通用三维数据格式(x,y,z)表示设置线程组的形式,即x*y*z个线程组。比如(8,8,2)的设置该内核中有8*8*2=128个线程组。

Compute Shader的线程:每个线程组中又包含多个线程,使用线程时用通用三维数据格式(x,y,z)表示,比如(6,6,4)的线程组定义是指每个线程组有6*6*4=144个线程,这144个线程即可以相互并行独立运行又可以共享运算结果。

线程唯一标识符,线程所在内核函数中的索引序号。

线程标识符,线程所在线程组中的索引序号。

线程组标识符,线程组所在内核函数中的索引序号。

源端:发送数据的客户端。

终端:接收数据的客户端。

RGBA:颜色的一种表示形式,其中R表示红色、G表示绿色、B表示蓝色、A表示透明度,任意一个颜色值都可以用.r,.g,.b,.a的形式调取其中对应位置的值,或用.rgb表示对应位置的红绿蓝值。

YUV:颜色的一种表示形式,其中Y表示亮度,UV表示色度,任意一个颜色都可以用.y,.u,.v的形式调取其中对应位置的值。

二维数据格式:以(x,y)形式出现的数据,任意一个三维数据都可以通过.x, .y的形式调取其中对应位置的值。

三维数据格式:以(x,y,z)形式出现的数据,任意一个三维数据都可以通过.x, .y,.z的形式调取其中对应位置的值。

现实图像:显示现实内容的图像。

虚拟图像:显示虚拟内容的图像。

全息图像:同时显示有现实内容以及虚拟内容的图像。

设备SDK:设备提供给开发者调用设备基础功能的插件。

实施例

要实现该跨平台视频通信方法,首先需要具备能与服务器通信的源端和终端,源端有图像采集设备。源端和终端均可以是AR/MR智能眼镜、手机或电脑。本实施例中源端为AR/MR智能眼镜,图像采集设备为AR/MR智能眼镜上的摄像头。

一种跨平台视频通信方法,包括以下步骤:S1、图像采集;S2、图像校准;S3、图像合成,定义2D纹理t4用来接收合成后的全息图像;S4、图像压缩;S5、图像传输,将S4中压缩的图像信息发送给服务器,再由服务器发送给指定的客户端;S6、图像解压和显示。

S1包括S11、采集现实图像和S12、采集虚拟图像。现实图像即通过设备硬件摄像头采集的现实场景的图像。

S11,利用摄像头获取现实图像,在引擎中创建一个纹理T1,用纹理T1接受摄像头获取的图像信息。具体的,源端获取AR/MR智能眼镜上摄像头的权限并根据摄像头列表选择设备佩戴时靠近用户面前正中位置,并且朝向用户前方的RGB摄像头Cam1,获取使用者前方的现实场景画面。

S12,在引擎中创建虚拟摄像机和纹理T2,虚拟摄像机的视角方向及位置与摄像头的空间映射位置一致、同步;这样才能保障采集虚拟图像的位置及角度与采集现实图像的位置角度一致。用纹理T2接受虚拟摄像机获取的虚拟图像信息。虚拟图像信息是引擎中模型或界面等内容。

该步骤中,应调整虚拟摄像机的视场角,使虚拟摄像机中采集到的虚拟图像范围比摄像头中采集到的范围略小。因为受该设备SDK以及硬件自身结构设计等因素影响,采集到的现实图像与虚拟图像不可能完全匹配。后方步骤需要进行两个图像的校准,本操作目的是确保采集到的虚拟图像范围完全处于显示图像范围内。方便后续以虚拟图像内容为基准图进行图像校准。

S2包括S21、校准像素比例和S22、校准偏移位置。T1与T2如果直接叠加得到的图像会与用户实际看到的全息图像有误差,该误差来自于设备SDK以及硬件自身结构设计等因素影响。所有的校准以T2作为基准进行。

S21中设置一个缩放系数Scale,在T1图像内容不变的情况下,同时对横纵方向上的像素数量进行等比例缩放调整。即给T1重新定义横纵方向上的像素数量,新的像素数量为T1图像原始像素数量乘以Scale得到T1a。即将T1图像原始像素数量乘以Scale得到T1a。不同的设备在进行这个步骤时Scale值也不同,初次计算时一般会先将Scale设置为1。

从S22开始使用Compute Shader将数据交于GPU进行处理,可以极大的提高运行效率。

S22包括以下步骤:

S221、创建一个Compute Shader A;

S222、在A中定义内核函数C。

S223、设置C中每个线程组中的线程为(8,8,1);这个设置方法在进行逐像素操作校准和后续JPEG算法压缩时都能极大的提高效率。

S224、在用CPU代码调用C的时候,设置C中线程组,结合S223中设置的线程数量,确保每个像素都有一个线程去进行处理;最大化利用GPU多线程优势。

定义C在x位置上线程组的数量为Cx;

定义C在y位置上线程组的数量为Cy;

定义C在z位置上线程组的数量为1;

Cx=(T2横坐标上像素数量+7)/8;

Cy=(T2 纵坐标上像素数量+7)/8;

+7是因为要让一个方向上的像素必定有一个线程可以与之对应,大于7浪费,小于7则可能会少设置一个线程组导致有像素纹理无法被调用。

以(Cx,Cy,1)来对C中线程组进行设置;

将T1a传递给A,在A中以2D纹理t1进行接收。

将T2传递给A,在A中以2D纹理t2进行接收。

在C中定义获取线程唯一标识符DTid为二维数组,DTid可以直接通过ComputeShader的自身机制获取到;

以t2为基准对t1的像素进行横向和纵向的移动进行校准。

t1需要在横向移动的值定义为t1x;

t1需要在纵向移动的值定义为t1y;

定义2D纹理t3用来接收校准后的t1。

t3= t1 [ DTid.x + t1x , DTid.y + t1y ]。

初次计算时,一般先将t1x和t1y都设置为0。

在S3中,定义2D纹理t4用来接收合成后的全息图像,

t4=t2[DTid].rgb*t2[DTid].a+ t3.rgb*(1-t2[DTid].a)。

在S4中,图像压缩选择JEPG格式的数据压缩以减轻网络传输的数据量。为提高JPEG的压缩性能,采用Compute Shader调用GPU的形式进行处理。

将t4的RGB颜色形式转换为YUV的颜色形式;在A中创建三个可共享内存的数组:D1、D2、D3;每个数组的容量为64;将YUV数据中的三个分量分别保存到D1、D2、D3中;

在C中定义获取线程标识符为Tid为二维数组,Tid可以直接通过Compute Shader的自身机制获取到

在C中定义获取线程组标识符为Gid为二维数组,Gid可以直接通过ComputeShader的自身机制获取到。

因为不同平台GPU对数据分组顺序不同,需要把一个8*8的二维数组校准为按照从左往右,从上到下的顺序展开的一维数组。

定义当前像素位置对应与这个一维数组中的序号为ix1;

则ix1=(校准后的Tid.y)*8+Tid.x。

例,在设备Hololens中通过(7-Tid.y)的方式进行校准。ix1=(7-Tid.y)*8+Tid.x。

定义2D纹理t5用来接收转化为YUV颜色形式的数据;

t5=t4[Tid+Gid*8].rgb*255

用D1,D2,D3分别储存t5对应序号像素的YUV值

D1[ix1]=t5.y

D2[ix1]=t5.u

D3[ix1]=t5.v

等待线程组任务完成后,以组为单位完成FDCT计算与量化;对D1,D2,D3进行离散余弦变换(FDCT)操作,变换公式如下:

待线程组任务完成后,定义D1,D2,D3中数据位置的序号为ix2;

则获取ix2序号的方式为 Tid.y*8+Tid.x;

全部YUV值经过FDCT计算及量化后的图像数据为t6,t6中像素的序号为dx,t6依次对每个线程组中计算得到的D1,D2,D3进行储存;

将整张图像数据转化为储存三维数据的一维数组;

dx为整张图像的像素序号

dx= (((t2的纵向像素值/8-Gid.y-1)* (t2的横向像素值/8)+Gid.x)*64)+ix2

t6[dx].y=D1[ix2]

t6[dx].u=D2[ix2]

t6[dx].v=D3[ix2]

把t6从Compute Shader中返回给CPU,使用CPU多线程进行AC/DC编码;

设置一个整数数组Z记录ZigZag编码索引序号。设置标准的哈夫曼表,寻址表,量化表;

开启一个内存流B1;

开启一个线程;

把t6分为每64个数据一组,这样每组称为一个数据元,对数据元进行ZigZag扫描;

创建整数型数组DU,定义其中元素数量为64;

用DU记录一组8*8 的ZigZag扫描后数据元素,改变其排列顺序方便后续AC编码。

对数据元中的每个元素,如果该元素是Y,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的Y,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].Y

对数据元中的每个元素,如果该元素是U,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的U,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].U

对数据元中的每个元素,如果该元素是V,则根据数据元中每个元素在数据元中的局部序号Ei从Z中找到ZigZag编码索引序号.DU的第Z[Ei]个位置用来储存t6[Ei+这个数据元的在t6中的序号]元素中的V,

DU[Z[Ei]]= t6[Ei+这个数据元的在t6中的序号*64].V

计算完一个数据元后,这个数据元中64个数据的ZigZag计算完成。

对DU中第一个数据的编码过程叫DC编码;

设置本数据元的DC差值为Diff等于本次的DC减去上一个数据元的DC;

如果Diff为0,使用哈夫曼表计算出的编码表第一个值写入字节流;

如果Diff不为0,根据哈夫曼表计算出的编码表寻找相对应Diff的值写入字节流;

DC编码后进行AC处理:

把编码后的JPEG格式数据储存入内存流B1中;

当该图像所有数据元循环处理完成后,在B1中进行数据对齐,写入数据尾;

为了节省数据,通过编码解码对应的方式,省去数据头的写入;

从B1中获取到字节数组B2,

在B2中加入图像中的配置数据,包括图像宽、高、图像质量。

S5是将S4中压缩的图像信息通过UDP发送给服务器,再由服务器发送给指定的客户端。

S6是将S4中的数据B2根据S4的步骤反向进行操作,还原图像为以RGB顺序循环排列的一维数组数据t7;在引擎中设置渲染纹理t8,将数据t7传入t8中显示为图像。

不同的设备,Scale值、t1x和t1y都不同。初次计算时,将Scale设置为1,将t1x和t1y都设置为0。在S6中,将t8中显示的图像与源端用户实际在设备中看到的图像相比较,根据肉眼观察如两者内容有偏差,则返回到S2,并调整缩放系数Scale、移动值t1x和t1y,重复S2、S3、S4、S5和S6。直至t8中显示的图像与源端用户实际在设备中看到的图像无偏差或偏差可接受,肉眼发觉不到两者的比例差别。此时Scale值、t1x,t1y的值就可以固定为该类设备Scale的常量值使用。

该跨平台视频通信方法的应用场景,例如在某工厂的设备检修现场,有一个用户检修员在检修设备,还有一个用户是技术专家,技术专家不在设备检修现场。现在需要技术专家远程指导检修员进行设备检修。

为了解放双手,检修员佩戴MR眼镜,技术专家可以使用电脑也可以使用手机。检修员一边操作,一边通过视频通信接受技术专家的指导。

因此开启视频通信后,检修员既能看到现实的设备图像也能看到虚拟的全息图像。此时通过本发明中的方法采集现实图像及虚拟图形,将两个图像校准融合后形成全息图像,压缩数据后发送给服务器,再通过服务器发送给技术专家。

技术专家收到全息数据后解压为全息图像显示出来,然后通过语音等方式对检修员进行技术指导。

检修员也可以通过MR眼镜画出虚拟的标注或者接收技术专家的远程标注,这些标注就是虚拟图像的部分,对于技术专家与检修员的沟通有重要的意义。

以上是检修员给技术专家发送视频图像的过程。

同时,技术专家也可以选择将自己这端的图像发送给检修员,这样会有更好的交流体验,技术专家可以选择发送不同的图像,例如以下两种情况。

情况1,技术专家把自身摄像头的图像发送检修员,让检修员可以看到技术专家的形象。

情况2,技术专家把自身的虚拟图像发送给检修员让检修员可以看到技术专家屏幕上显示的内容。

综上所述,本发明一种跨平台视频通信方法,该视频通信方法利用ComputeShader技术使用GPU执行,使用大量运算单元进行并行计算,大幅提高整体运算速度与性能,在引擎中将源端视频数据流化,并将源端数据流通过网络传输到终端,最后在终端解码还原源端视频画面,支持将AR/MR等技术中的多个画面内容进行高性能融合,为网络传输减轻了带宽方面的负担,同时提供了可扩展空间。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120114580296