一种基于虚拟化技术的Linux视频编码方法

文档序号:1941810 发布日期:2021-12-07 浏览:14次 >En<

阅读说明:本技术 一种基于虚拟化技术的Linux视频编码方法 (Linux video coding method based on virtualization technology ) 是由 刘波 史杨 张琳 姜兆艺 于 2021-08-30 设计创作,主要内容包括:本发明提供一种基于虚拟化技术的Linux视频编码方法,通过Linux虚拟机中的capturemode(桌面抓取模块)、agentmode(代理模块)、servermode(服务模块)和clientmode(客户端模块)实现,该基于虚拟化技术的Linux视频编码方法设计合理,通过给linux虚拟机配置gpu显卡,终端连接linux虚拟机,利用gpu显卡抓取桌面,终端显示和运行,能够充分利用gpu的计算能力和硬编功能,运行大型的3D游戏和3D软件。(The invention provides a Linux video coding method based on a virtualization technology, which is realized by capturemode (a desktop grabbing module), an agentmaode (an agent module), a servermode (a service module) and a clientmode (a client module) in a Linux virtual machine.)

一种基于虚拟化技术的Linux视频编码方法

技术领域

本发明属于视频编码技术领域,特别涉及一种基于虚拟化技术的Linux视频编码方法。

背景技术

在实体计算机上,通过软件模拟出的一台或者多台虚拟计算机叫虚拟机。虚拟机使用宿主机的硬件资源,拥有真实计算机的绝大多数功能,Linux操作系统是一款在服务器上广泛应用的操作系统,现有的Linux虚拟机没有gpu显示模块,不能充分利用gpu的硬件功能,不能运行大型的3D游戏,建模软件,gpu的强大计算能力和硬编功能不能够得到充分的利用,为此,本发明提出一种基于虚拟化技术的Linux视频编码方法。

发明内容

为了解决现有技术存在的问题,本发明提供了一种基于虚拟化技术的Linux视频编码方法,本发明的基于虚拟化技术的Linux视频编码方法设计合理,通过给linux虚拟机配置gpu显卡,终端连接linux虚拟机,利用gpu显卡抓取桌面,终端显示和运行,能够充分利用gpu的计算能力和硬编功能,运行大型的3D游戏和3D软件。

为了实现上述目的,本发明是通过如下的技术方案来实现:一种基于虚拟化技术的Linux视频编码方法,通过Linux虚拟机中的capture mode(桌面抓取模块)、agent mode(代理模块)、server mode(服务模块)和client mode(客户端模块)实现,具体编码方法如下:

步骤一:Linux虚拟机开机会以服务的形式自动启动agent进程,作为网络服务端,同时agent进程在网络服务初始化完成后,处理监听(listen)状态,等待客户端的网络连接(即capture mode);当用户在远程客户端(即client mode)输入用户名和密码连接linux虚拟机,如果验证通过后,此时agent进程会产生capture子进程;capture子进程作为客户端与agent进程在linux虚拟机内部进行本地socket进程间通讯,桌面数据由capture子进程到agent进程,在真正桌面数据传输之前,会进行数据流编码参数确认;

步骤二:各个模块之间进行消息交互,具体流程如下:

①VGPU_SEND_ADAPTER_MONITOR:capture mode发送vgpu显卡的相关信息;

②VGPU_SET_PARAM_START_REQUEST:agent mode发送数据流的编码参数信息;

③VGPU_GET_DATA_REQUEST:agent mode发送此信息后,capture子进程开始传输编码后的桌面数据给agent服务进程;

④VGPU_STOP_REQUEST:capture子进程暂停数据的发送;

⑤VGPU_DESTROY_REQUEST:capture子进程结束运行并退出;

步骤三:各个模块的运行原理具体如下:

①capture mode:capture进程产生后,作为客户端与agent服务端进程进行socket连接,连接后,主进程会产生三个子线程进行工作(包括其中的主线程),mainthread,capture thread,send thread,具体分工如下:main thread主要是接收并处理agent服务端发送过来的信息,对capture thread的抓取到的ARGB桌面数据利用ffmpeg库进行nvidia gpu硬编码,或者cpu软编,目前支持h264,h265编码;capture thread主要是抓取linux虚拟机桌面数据,重点是调用xcb库函数xcb_shm_get_image和xcb_shm_get_image_reply这两个函数实现,使用linux共享内存的方式获取原始数据shmget;sendthread的功能是实现将main thread编码后的桌面数据通过tcp连接发送到agent进程;

②agent mode:agent进程会在Linux虚拟机开机时以服务的形式自动启动,使用linux模块systemd,当用户在远程客户端连接linux虚拟机时,agent会从远程客户端获取相应的数据流编码参数,产生capture子进程,以消息VGPU_SET_PARAM_START_REQUEST的形式传给capture子进程,然后发送消息VGPU_GET_DATA_REQUEST给capture子进程,源源不断的从capture子进程得到编码后linux虚拟机桌面数据,得到数据后,通过qemu启动linux虚拟机时所创建的virtio字符设备(/dev/virtio-ports/com.redhat.spice.0)转发给server mode,当编码数据比较大时,agent进程需要将数据分包,分包中包括包的数目,每个包的大小,在server mode中组包需要这些信息;

③server mode:linux虚拟机是由qemu以进程的形式创建,一般运行在centos操作系统,它通过调用spice server库,当字符设备有agent mode的编码数据传输过来时,会读取数据并确定是否需要组包,当全部完整的读取整个包数据后,才会通过tcp连接传输到client mode;

④client mode:当用户通过远程客户端连接到linux虚拟机时,会不断读取spiceserver传输过来的编码数据,会产生二个处理线程,decode thread,render thread;decode thread进行ffmpeg解码,具体包括CPU软解和GPU硬解,将解码后的数据转化为rgb格式的数据,render thread利用cairo进行渲染绘制,通过显示器显示出来,两个线程之间的数据通过队列流通;

步骤四:通过capture mode(桌面抓取模块)、agent mode(代理模块)、servermode(服务模块)和client mode(客户端模块)四个模块的相互协助,当用户连接linux虚拟机,该虚拟机就可以充分利用GPU的计算能力和硬编功能,运行大型的3D游戏和3D软件。

作为本发明的一种优选实施方式,所述步骤一之前需要进行Linux vgpu环境配置,包括服务器gpu显卡设备驱动安装及管理以及linux虚拟机虚拟显卡驱动安装及license的配置。

作为本发明的一种优选实施方式,所述步骤一中数据流编码参数确认包括但不限于编码方式(h264,h265)、gpu硬编还是cpu软编和数据流的宽、高以及帧率。

作为本发明的一种优选实施方式,所述步骤三的②中,当编码数据大于16kb时agent进程需要将数据分包。

作为本发明的一种优选实施方式,所述步骤二的⑤中,当用户断开linux虚拟机连接时,会发送消息VGPU_DESTROY_REQUEST给capture子进程结束运行,当用户再次连接时,会产生新的capture子进程。

本发明的有益效果为:本发明的一种基于虚拟化技术的Linux视频编码方法通过给linux虚拟机配置gpu显卡,终端连接linux虚拟机,利用gpu显卡抓取桌面,终端显示和运行,能够充分利用gpu的计算能力和硬编功能,运行大型的3D游戏和3D软件。

附图说明

图1为一种基于虚拟化技术的Linux视频编码方法的模块通信图;

图2为一种基于虚拟化技术的Linux视频编码方法的实时数据流程图;

图3为一种基于虚拟化技术的Linux视频编码方法的消息交互流程图。

具体实施方式

为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体实施方式,进一步阐述本发明。

请参阅图1至图3,本发明提供一种技术方案:一种基于虚拟化技术的Linux视频编码方法,通过Linux虚拟机中的capture mode(桌面抓取模块)、agent mode(代理模块)、server mode(服务模块)和client mode(客户端模块)实现,具体编码方法如下:

步骤一:Linux虚拟机开机会以服务的形式自动启动agent进程,作为网络服务端,同时agent进程在网络服务初始化完成后,处理监听(listen)状态,等待客户端的网络连接(即capture mode);当用户在远程客户端(即client mode)输入用户名和密码连接linux虚拟机,如果验证通过后,此时agent进程会产生capture子进程;capture子进程作为客户端与agent进程在linux虚拟机内部进行本地socket进程间通讯,桌面数据由capture子进程到agent进程,在真正桌面数据传输之前,会进行数据流编码参数确认;

步骤二:各个模块之间进行消息交互,具体流程如下:

①VGPU_SEND_ADAPTER_MONITOR:capture mode发送vgpu显卡的相关信息;

②VGPU_SET_PARAM_START_REQUEST:agent mode发送数据流的编码参数信息;

③VGPU_GET_DATA_REQUEST:agent mode发送此信息后,capture子进程开始传输编码后的桌面数据给agent服务进程;

④VGPU_STOP_REQUEST:capture子进程暂停数据的发送;

⑤VGPU_DESTROY_REQUEST:capture子进程结束运行并退出;

步骤三:各个模块的运行原理具体如下:

①capture mode:capture进程产生后,作为客户端与agent服务端进程进行socket连接,连接后,主进程会产生三个子线程进行工作(包括其中的主线程),mainthread,capture thread,send thread,具体分工如下:main thread主要是接收并处理agent服务端发送过来的信息,对capture thread的抓取到的ARGB桌面数据利用ffmpeg库进行nvidia gpu硬编码,或者cpu软编,目前支持h264,h265编码;capture thread主要是抓取linux虚拟机桌面数据,重点是调用xcb库函数xcb_shm_get_image和xcb_shm_get_image_reply这两个函数实现,使用linux共享内存的方式获取原始数据shmget;sendthread的功能是实现将main thread编码后的桌面数据通过tcp连接发送到agent进程;

②agent mode:agent进程会在Linux虚拟机开机时以服务的形式自动启动,使用linux模块systemd,当用户在远程客户端连接linux虚拟机时,agent会从远程客户端获取相应的数据流编码参数,产生capture子进程,以消息VGPU_SET_PARAM_START_REQUEST的形式传给capture子进程,然后发送消息VGPU_GET_DATA_REQUEST给capture子进程,源源不断的从capture子进程得到编码后linux虚拟机桌面数据,得到数据后,通过qemu启动linux虚拟机时所创建的virtio字符设备(/dev/virtio-ports/com.redhat.spice.0)转发给server mode,当编码数据比较大时,agent进程需要将数据分包,分包中包括包的数目,每个包的大小,在server mode中组包需要这些信息;

③server mode:linux虚拟机是由qemu以进程的形式创建,一般运行在centos操作系统,它通过调用spice server库,当字符设备有agent mode的编码数据传输过来时,会读取数据并确定是否需要组包,当全部完整的读取整个包数据后,才会通过tcp连接传输到client mode;

④client mode:当用户通过远程客户端连接到linux虚拟机时,会不断读取spiceserver传输过来的编码数据,会产生二个处理线程,decode thread,render thread;decode thread进行ffmpeg解码,具体包括CPU软解和GPU硬解,将解码后的数据转化为rgb格式的数据,render thread利用cairo进行渲染绘制,通过显示器显示出来,两个线程之间的数据通过队列流通;

步骤四:通过capture mode(桌面抓取模块)、agent mode(代理模块)、servermode(服务模块)和client mode(客户端模块)四个模块的相互协助,当用户连接linux虚拟机,该虚拟机就可以充分利用GPU的计算能力和硬编功能,运行大型的3D游戏和3D软件。

作为本发明的一种优选实施方式,所述步骤一之前需要进行Linux vgpu环境配置,包括服务器gpu显卡设备驱动安装及管理以及linux虚拟机虚拟显卡驱动安装及license的配置。

作为本发明的一种优选实施方式,所述步骤一中数据流编码参数确认包括但不限于编码方式(h264,h265)、gpu硬编还是cpu软编和数据流的宽、高以及帧率。

作为本发明的一种优选实施方式,所述步骤三的②中,当编码数据大于16kb时agent进程需要将数据分包。

作为本发明的一种优选实施方式,所述步骤二的⑤中,当用户断开linux虚拟机连接时,会发送消息VGPU_DESTROY_REQUEST给capture子进程结束运行,当用户再次连接时,会产生新的capture子进程。

作为本发明的一种优选实施方式,本发明通过给linux虚拟机配置gpu显卡,终端连接linux虚拟机,利用gpu显卡抓取桌面,终端显示和运行,能够充分利用gpu的计算能力和硬编功能,运行大型的3D游戏和3D软件。

以上显示和描述了本发明的基本原理和主要特征和本发明的优点,对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。

10页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:视频录制方法、装置、存储介质及终端设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类