CN112004147A - 一种视频渲染方法、装置、电子设备及存储介质 - Google Patents

一种视频渲染方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN112004147A
CN112004147A CN202010846601.XA CN202010846601A CN112004147A CN 112004147 A CN112004147 A CN 112004147A CN 202010846601 A CN202010846601 A CN 202010846601A CN 112004147 A CN112004147 A CN 112004147A
Authority
CN
China
Prior art keywords
program
video frame
memory
video
rendering
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202010846601.XA
Other languages
English (en)
Inventor
丛晓
李淼
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Yunzhong Rongxin Network Technology Co ltd
Original Assignee
Beijing Yunzhong Rongxin Network Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Yunzhong Rongxin Network Technology Co ltd filed Critical Beijing Yunzhong Rongxin Network Technology Co ltd
Priority to CN202010846601.XA priority Critical patent/CN112004147A/zh
Publication of CN112004147A publication Critical patent/CN112004147A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/44Processing of video elementary streams, e.g. splicing a video clip retrieved from local storage with an incoming video stream or rendering scenes according to encoded video stream scene graphs
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/433Content storage operation, e.g. storage operation in response to a pause request, caching operations
    • H04N21/4331Caching operations, e.g. of an advertisement for later insertion during playback
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/40Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
    • H04N21/43Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
    • H04N21/44Processing of video elementary streams, e.g. splicing a video clip retrieved from local storage with an incoming video stream or rendering scenes according to encoded video stream scene graphs
    • H04N21/44012Processing of video elementary streams, e.g. splicing a video clip retrieved from local storage with an incoming video stream or rendering scenes according to encoded video stream scene graphs involving rendering scenes according to scene graphs, e.g. MPEG-4 scene graphs
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/80Generation or processing of content or additional data by content creator independently of the distribution process; Content per se
    • H04N21/83Generation or processing of protective or descriptive data associated with content; Content structuring
    • H04N21/845Structuring of content, e.g. decomposing content into time segments
    • H04N21/8455Structuring of content, e.g. decomposing content into time segments involving pointers to the content, e.g. pointers to the I-frames of the video stream

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Two-Way Televisions, Distribution Of Moving Picture Or The Like (AREA)

Abstract

本申请提供一种视频渲染方法、装置、电子设备及存储介质,该方法包括:获得视频帧,视频帧为视频数据中的其中一帧图像;使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序,第一程序的类型与第二程序的类型不相同;使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染。在上述的实现过程中,通过第一程序和第二程序共享同一个内存池来缓存视频数据,减少了操作系统在内存中回收程序对象时不断地分配和释放内存的操作,有效地提高了第一程序和第二程序之间的交互效率,从而有效地改善了在不同类型的程序之间传输视频数据和渲染视频数据的速度非常慢的问题。

Description

一种视频渲染方法、装置、电子设备及存储介质
技术领域
本申请涉及视频处理和视频渲染的技术领域,具体而言,涉及一种视频渲染方法、装置、电子设备及存储介质。
背景技术
JavaScript是一种直译式脚本语言,也是一种动态类型、弱类型、基于原型的用户终端脚本语言,内置支持类型;该语言的解释器或者解析器被称为JavaScript引擎,JavaScript是浏览器的一部分,JavaScript是一种广泛用于用户终端的脚本语言。
Node.js是能够在服务器端运行JavaScript的开放源代码、跨平台的JavaScript运行环境;Node.js采用Google开发的V8引擎运行代码,其中的V8引擎是由C++语言编写的,Node.js使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。
Electron(原名为Atom Shell)是GitHub开发的一个开源框架;Electron允许使用Node.js作为后端,以及使用Chromium作为前端,来完成桌面图形用户界面(GraphicalUser Interface,GUI)应用程序的开发。
在具体的实践过程中发现,使用Electron环境中的第一程序(例如C++)和第二程序(例如JavaScript)之间传输视频数据,并渲染视频数据,出现卡顿闪屏现象,也就是说,在不同类型的程序之间传输视频数据和渲染视频数据的速度非常慢。
发明内容
本申请实施例的目的在于提供一种视频渲染方法、装置、电子设备及存储介质,用于改善在不同类型的程序之间传输视频数据和渲染视频数据的速度非常慢的问题。
本申请实施例提供了一种视频渲染方法,包括:获得视频帧,视频帧为视频数据中的其中一帧图像;使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序,第一程序的类型与第二程序的类型不相同,第一程序与第二程序均运行于预设应用环境中;使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染。在上述的实现过程中,使用第一程序将获得的视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序;使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染;也就是说,通过第一程序(例如C++)和第二程序(例如JavaScript)共享同一个内存池来缓存(buffer)视频数据,减少了操作系统在内存中回收程序对象时不断地分配和释放内存的操作,有效地提高了第一程序和第二程序之间的交互效率,从而有效地改善了在不同类型的程序之间传输视频数据和渲染视频数据的速度非常慢的问题。
可选地,在本申请实施例中,在使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号之前,还包括:使用第一程序向操作系统申请分配内存块;使用第一程序获得操作系统分配的内存块对应的内存地址。使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,包括:使用第一程序将视频帧存储至预先分配的内存块;使用第一程序在内存池中获取内存块的内存地址对应的索引号。在上述的实现过程中,通过使用第一程序将视频帧存储至预先分配的内存块;使用第一程序在内存池中获取内存块的内存地址对应的索引号;从而提高了对内存池的管理效率,有效地提高了第一程序和第二程序之间的交互效率。
可选地,在本申请实施例中,使用第二程序根据第一程序转发的索引号获取视频帧,包括:使用第二程序在内存池中查找与索引号对应的内存块的内存地址;使用第二程序从内存地址对应的内存块中读取视频帧。在上述的实现过程中,通过使用第二程序在内存池中查找与索引号对应的内存块的内存地址;使用第二程序从内存地址对应的内存块中读取视频帧;从而提高了对内存池的管理效率,有效地提高了第一程序和第二程序之间的交互效率。
可选地,在本申请实施例中,将视频帧进行渲染,包括:使用开放图形库接口将视频帧渲染至应用程序窗口;或者使用网页即时通信接口将视频帧渲染至浏览器窗口。在上述的实现过程中,通过使用开放图形库接口将视频帧渲染至应用程序窗口;或者使用网页即时通信接口将视频帧渲染至浏览器窗口;从而使得视频可以在应用程序窗口或者浏览器窗口中显示,提高了视频帧渲染和显示的效率。
可选地,在本申请实施例中,获得视频帧,包括:使用预先注册的驱动程序接收终端设备发送的视频帧;或者使用开源计算机视觉库从视频数据文件中解析出视频帧。在上述的实现过程中,通过使用预先注册的驱动程序接收终端设备发送的视频帧;或者使用开源计算机视觉库从视频数据文件中解析出视频帧;通过驱动程序接收视频帧或者使用开源计算机视觉库解析视频帧,从而有效地提高了获得视频帧的速度。
可选地,在本申请实施例中,还包括:若使用预先注册的驱动程序接收终端设备发送的视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧发送给终端设备;或者若使用开源计算机视觉库从视频数据文件中解析出视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧存储至视频数据文件。
本申请实施例还提供了一种视频渲染装置,包括:视频帧获得模块,用于获得视频帧,视频帧为视频数据中的其中一帧图像;索引号转发模块,用于使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序,第一程序的类型与第二程序的类型不相同,第一程序与第二程序均运行于预设应用环境中;视频帧渲染模块,用于使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染。
可选地,在本申请实施例中,视频渲染装置,还包括:内存申请分配模块,用于使用第一程序向操作系统申请分配内存块;内存地址获得模块,用于使用第一程序获得操作系统分配的内存块对应的内存地址。索引号转发模块,包括;视频帧存储模块,用于使用第一程序将视频帧存储至预先分配的内存块;索引号获取模块,用于使用第一程序在内存池中获取内存块的内存地址对应的索引号。
可选地,在本申请实施例中,视频帧渲染模块,包括;内存地址查找模块,用于使用第二程序在内存池中查找与索引号对应的内存块的内存地址;程序读取视频模块,用于使用第二程序从内存地址对应的内存块中读取视频帧。
可选地,在本申请实施例中,视频帧渲染模块,包括:视频窗口渲染模块,用于使用开放图形库接口将视频帧渲染至应用程序窗口;或者使用网页即时通信接口将视频帧渲染至浏览器窗口。
可选地,在本申请实施例中,视频帧获得模块,包括:视频接收解析模块,用于使用预先注册的驱动程序接收终端设备发送的视频帧;或者使用开源计算机视觉库从视频数据文件中解析出视频帧。
可选地,在本申请实施例中,视频渲染装置,还包括:视频发送存储模块,用于若使用预先注册的驱动程序接收终端设备发送的视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧发送给终端设备;或者若使用开源计算机视觉库从视频数据文件中解析出视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧存储至视频数据文件。
本申请实施例还提供了一种电子设备,包括:处理器和存储器,存储器存储有处理器可执行的机器可读指令,机器可读指令被处理器执行时执行如上面描述的方法。
本申请实施例还提供了一种存储介质,该存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如上面描述的方法。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出的本申请实施例提供的视频渲染方法的流程示意图;
图2示出的本申请实施例提供的电子设备与终端设备交互的流程示意图;
图3示出的本申请实施例提供的视频渲染装置的结构示意图;
图4示出的本申请实施例提供的电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整的描述。
在介绍本申请实施例提供的视频渲染方法之前,先介绍本申请实施例所涉及的一些概念:
帧(英语:frame),是一个包括“帧同步串行”的数字数据传输单元或数字数据包,帧同步串行的意义在于接收器通过一串特定的连续比特或符号来确定一个帧的开始和结束,在计算机网络和通信领域,如果一个接收器在一个帧传输的过程中时被接入到系统中,就会忽视接收到的数据直到它检测到一个新的帧同步串行。
内存池(Memory Pool),是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation);具体例如:在Java语音中直接使用new等函数接口申请分配内存,在C语言中直接使用malloc、realloc、calloc、free等函数接口申请分配内存。
视频帧率(Frame rate),是用于测量显示帧数的量度;所谓的测量单位为每秒显示帧数(Frames per Second,FPS)或“赫兹”(Hz),这里的视频帧率可以用于影视中的视频制作等场景。
虚拟内存(Virtual Memory),是计算机系统内存管理的一种技术;虚拟内存使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
服务器是指通过网络提供计算服务的设备,服务器例如:x86服务器以及非x86服务器,非x86服务器包括:大型机、小型机和UNIX服务器。当然在具体的实施过程中,上述的服务器可以具体选择大型机或者小型机,这里的小型机是指采用精简指令集计算(ReducedInstruction Set Computing,RISC)、单字长定点指令平均执行速度(MillionInstructions Per Second,MIPS)等专用处理器,主要支持UNIX操作系统的封闭且专用的提供计算服务的设备;这里的大型机,又名大型主机,是指使用专用的处理器指令集、操作系统和应用软件来提供计算服务的设备。
需要说明的是,本申请实施例提供的视频渲染方法可以被电子设备执行,这里的电子设备是指具有执行计算机程序功能的设备终端或者上述的服务器,设备终端例如:智能手机、个人电脑(personal computer,PC)、平板电脑、个人数字助理(personal digitalassistant,PDA)、移动上网设备(mobile Internet device,MID)、网络交换机或网络路由器等。
在介绍本申请实施例提供的视频渲染方法之前,先介绍该视频渲染方法适用的应用场景,这里的应用场景包括但不限于:在两种不同的应用程序之间传输视频数据时使用该视频渲染方法加速视频数据的传输,或者在电子设备接收完其它终端设备发送的视频数据之后,使用该视频渲染方法加速视频数据的渲染播放等,这里的两种不同应用程序是指两种应用程序使用不同的语言编写并编译或解释的;当然这里的两种不同应用程序可以均运行在同一个应用环境中,这里的应用环境例如可以是Electron开源框架的环境。
请参见图1示出的本申请实施例提供的视频渲染方法的流程示意图;该视频渲染方法通过第一程序(例如C++)和第二程序(例如JavaScript)共享同一个内存池来缓存(buffer)视频数据,减少了操作系统在内存中回收程序对象时不断地分配和释放内存的操作,有效地提高了第一程序和第二程序之间的交互效率,从而提升了在不同类型的程序之间传输视频数据和渲染视频数据的速度;上述的视频渲染方法可以包括如下步骤:
步骤S110:获得视频帧。
可以理解的是,上述的视频帧是指视频数据中的其中一帧图像;这里的视频数据具体例如:渲染分辨率为640*480,视频帧率为30的RGB原始视频数据,如果1个像素点占24比特位(即等于3字节),那么1秒时间的视频数据的文件大小约为27.6MB,Electron环境中的node.js难以直接频繁地操纵大内存,另外频繁的进行内存交互会消耗大量的时间进行数据移动,给系统带来很大的压力。
上述步骤S110中的获得视频帧的实施方式包括:
第一种方式,接收其它终端设备发送的视频帧,将视频帧存储至文件系统、数据库或移动存储设备中,具体的接收视频帧的过程例如:使用预先注册的驱动程序接收终端设备发送的视频帧,这里的预先注册的驱动程序可以是虚拟摄像头的驱动程序,具体例如可以是V4L2,这里的V4L2是Video for linux2的简称,是linux操作系统中关于视频设备的内核驱动;在Linux操作系统中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,这里的V4L2是隶属于字符设备驱动程序的,这里的视频采集设备可以是在网络上公共场所拍摄的对公众开放的网络摄像头。
第二种方式,获取预先存储的视频帧,具体例如:Electron环境中V8引擎运行的C++语言编写的程序从文件系统中的视频文件解析出视频帧,或者使用该C++语言编写的程序从数据库中的视频文件获取视频帧,或者使用该C++语言编写的程序从移动存储设备中的视频文件获取视频帧;上述的视频文件获取视频帧具体例如:使用开源计算机视觉库(OpenSource Computer Vision Library,OpenCV)从视频数据文件中解析出视频帧,这里的OpenCV是一个跨平台的计算机视觉库;OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。
第三种方式,使用浏览器等软件获取互联网上的视频帧,或者使用其它应用程序访问互联网获得视频帧。在上述的实现过程中,通过使用预先注册的驱动程序接收终端设备发送的视频帧;或者使用开源计算机视觉库从视频数据文件中解析出视频帧;通过驱动程序接收视频帧或者使用开源计算机视觉库解析视频帧,从而有效地提高了获得视频帧的速度。
在步骤S110之后,执行步骤S120:使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序。
其中,第一程序的类型与第二程序的类型不相同,第一程序与第二程序均运行于预设应用环境中,这里的预设应用环境可以是指Electron环境,第一程序可以是指Electron环境中V8引擎运行的C++语言编写的程序,第二程序可以是指Electron环境中Node.js运行的JavaScript语言编写的程序。这里的V8引擎是一个JavaScript引擎实现,V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码,并且使用了如内联缓存(inline caching)等方法来提高性能。
可以理解的是,上述的内存池可以理解为内存块的集合,内存池中的每一个内存块均可以存储一个视频帧数据,而视频帧对应的索引号可以理解为该视频帧在内存池中对应的索引位置,索引位置中存储着该视频帧的实际上在内存中存储的内存地址。在使用第一程序将视频帧存储至预先申请的内存池之前,第一程序还需要事先向操作系统申请分配内存,即在步骤S120之前,第一程序向操作系统申请分配内存的过程包括:
步骤S121:使用第一程序向操作系统申请分配内存块。
操作系统(Operating System,OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序,同时也是计算机系统的内核与基石;操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务;常见的操作系统包括:Linux操作系统、Windows操作系统和macOS操作系统。
上述步骤S121中的使用第一程序向操作系统申请分配内存块的实施方式例如:使用malloc、realloc、calloc、free等函数应用程序接口(Application ProgrammingInterface,API)向操作系统申请分配内存块(Memory Block),这里的内存块可以是指真正的物理内存,具体例如:动态随机存取存储器(Dynamic Random Access Memory,DRAM),这里的DRAM是一种半导体存储器,主要的作用原理是利用电容内存储电荷的多寡来代表一个二进制比特(bit)是1还是0;这里的内存块还可以是指操作系统在虚拟内存中分配的一个内存块。
步骤S122:使用第一程序获得操作系统分配的内存块对应的内存地址。
上述步骤S122中的使用第一程序获得操作系统分配的内存块对应的内存地址的实施方式例如:若第一程序是Electron环境中V8引擎运行的C++语言编写的程序,那么可以使用Electron环境中V8引擎运行的C++语言编写的程序获得操作系统分配的内存块对应的内存地址(Memory Address);这里的内存地址是一种用于软件及硬件等不同层级中的数据概念,用来访问电脑主存中的数据;内存地址一般以固定长度之数字表示,并被视为无号整数操作。在上述的实现过程中,使用第一程序向操作系统申请分配内存块;使用第一程序获得操作系统分配的内存块对应的内存地址;通过预先申请分配内存,从而使得内存在使用时就不用再临时去申请分配内存,而是直接可以使用已经分配的内存,有效地提高了第一程序和第二程序之间的交互效率。
上述步骤S120中的使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号的实施方式可以包括如下步骤:
步骤S123:使用第一程序将视频帧存储至预先分配的内存块。
上述步骤S123中的使用第一程序将视频帧存储至预先分配的内存块的实施方式例如:内存池里放置内存块的内存地址列表和索引号,假设内存池中的内存块的数量上限为30,若一个内存块中只存放一个视频帧,那么视频帧的索引号数量上限也可以为30,具体可以根据具体实际情况调整视频帧的索引号数量,即调整内存池中的内存块的数量;若这里的索引号为0到29,当第一帧数据到达时,根据视频数据大小分配一帧数据的内存块,假设该内存块的内存地址为0x001。
步骤S124:使用第一程序在内存池中获取内存块的内存地址对应的索引号。
上述步骤S124中的使用第一程序在内存池中获取内存块的内存地址对应的索引号的实施方式例如:假设上述内存块的内存地址为0x001,那么就将内存地址就0x001存放在内存池的0号索引位置,该内存地址就0x001对应的索引号就是0。
在具体的实践过程中,按照上面的内存分配方法依次类推,直到存放完30帧视频数据,当第31帧视频数据到来时,第一程序就会去获取使用0号索引中的内存地址,然后根据内存地址去使用已经分配的内存,依次类推,循环使用,当视频数据传输结束后,第一程序就可以对内存池中分配的内存进行释放。在上述的实现过程中,通过使用第一程序将视频帧存储至预先分配的内存块;使用第一程序在内存池中获取内存块的内存地址对应的索引号;从而提高了对内存池的管理效率,有效地提高了第一程序和第二程序之间的交互效率。
步骤S125:使用第一程序将内存地址对应的索引号转发给第二程序。
上述步骤S125中的使用第一程序将内存地址对应的索引号转发给第二程序的实施方式例如:若第一程序为Electron环境中V8引擎运行的C++语言编写的程序,第二程序为Electron环境中Node.js运行的JavaScript语言编写的程序,那么Electron环境中V8引擎运行的C++语言编写的程序可以将内存地址对应的索引号转发给Node.js运行的JavaScript语言编写的程序;若索引号为0,那么第一程序将内存地址为0x001对应的索引号0转发给第二程序。
在步骤S120之后,执行步骤S130:使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染。
在具体的实践过程中,还可以使用图形处理单元(Graphics Processing Unit,GPU)或者视频处理单元(Video Processing Unit,VPU)来加速上述步骤的执行过程,即使用GPU或者VPU来加速视频帧的传输和处理过程,这里的GPU或者VPU是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器;上述步骤S130中的使用第二程序根据第一程序转发的索引号获取视频帧的实施方式可以包括如下步骤:
步骤S131:使用第二程序在内存池中查找与索引号对应的内存块的内存地址。
上述步骤S131中的使用第二程序在内存池中查找与索引号对应的内存块的内存地址的实施方式例如:使用Electron环境中Node.js运行的JavaScript语言编写的程序接收到第一程序转发的索引号0,也就是说,使用第二程序在内存池中查找与索引号为0的内存块的内存地址则为0x001。
步骤S132:使用第二程序从内存地址对应的内存块中读取视频帧。
上述步骤S132中的使用第二程序从内存地址对应的内存块中读取视频帧的实施方式例如:若内存地址为0x001,使用Electron环境中Node.js运行的JavaScript语言编写的程序从内存地址0x001对应的内存块中读取视频帧数据,即使用第二程序从内存地址0x001对应的内存块中读取视频帧数据。在上述的实现过程中,通过使用第二程序在内存池中查找与索引号对应的内存块的内存地址;使用第二程序从内存地址对应的内存块中读取视频帧;从而提高了对内存池的管理效率,有效地提高了第一程序和第二程序之间的交互效率。
上述步骤S130的第一种实施方式,将视频帧渲染至应用程序窗口包括:
步骤S133:使用开放图形库接口将视频帧渲染至应用程序窗口。
上述步骤S133中的使用开放图形库接口将视频帧渲染至应用程序窗口的实施方式包括:使用开放图形库(Open Graphics Library,OpenGL)将视频帧渲染至应用程序窗口;这里的OpenGL是指用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API);这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。
上述步骤S130的第二种实施方式,将视频帧渲染至浏览器窗口包括:
步骤S134:使用网页即时通信接口将视频帧渲染至浏览器窗口。
上述步骤S134中的使用网页即时通信接口将视频帧渲染至浏览器窗口的实施方式包括:使用网页即时通信(Web Real-Time Communication,WebRTC)接口将视频帧渲染至浏览器窗口;这里的WebRTC接口是一个支持网页浏览器进行实时语音对话或视频对话的应用编程接口,WebRTC支持大部分的浏览器;这些浏览器例如:Microsoft Edge浏览器、Google Chrome浏览器、Mozilla Firefox浏览器、Opera浏览器、Safari浏览器和Firefox浏览器等等。
在上述的实现过程中,通过使用开放图形库接口将视频帧渲染至应用程序窗口;或者使用网页即时通信接口将视频帧渲染至浏览器窗口;从而使得视频可以在应用程序窗口或者浏览器窗口中显示,提高了视频帧渲染和显示的效率。
可选地,在将视频帧进行渲染之后,还可以将渲染后的视频帧进一步处理的第一种实施方式,第一种实施方式可以包括:
步骤S135:将渲染后的视频帧发送给终端设备。
上述步骤S135中的将渲染后的视频帧发送给终端设备的实施方式例如:若使用预先注册的驱动程序接收终端设备发送的视频帧,则电子设备在将视频帧进行渲染之后,电子设备将渲染后的视频帧通过传输控制协议(Transmission Control Protocol,TCP)或者用户数据报协议(User Datagram Protocol,UDP)发送给终端设备;其中,这里的TCP协议又名网络通讯协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议;在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层;不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换;这里的UDP是User Datagram Protocol的简称,中文名是用户数据报协议,UDP协议是开放式系统互联(Open System Interconnection,OSI)参考模型中一种无连接的传输层协议。
可选地,在将视频帧进行渲染之后,还可以将渲染后的视频帧进一步处理的第二种实施方式,第二种实施方式可以包括:
步骤S136:电子设备将渲染后的视频帧存储至视频数据文件。
上述步骤S136中的将渲染后的视频帧存储至视频数据文件的实施方式包括:若使用开源计算机视觉库从视频数据文件中解析出视频帧,则电子设备在将视频帧进行渲染之后,电子设备将渲染后的视频帧存储至磁盘文件系统中的视频数据文件,或者是将渲染后的视频帧存储至星际文件系统(Inter Planetary File System,IPFS)中的视频数据文件;这里的磁盘文件系统是指一种设计用来利用数据存储设备来保存计算机文件的文件系统,最常用的数据存储设备是磁盘驱动器,可以直接或者间接地连接到计算机上;具体例如:FAT、exFAT、NTFS、HFS、ext2、ext3和ext4等文件系统格式;这里的IPFS是一个旨在创建持久且分布式存储和共享文件的网络传输协议,IPFS是一种内容可寻址的对等超媒体分发协议;在IPFS网络中的节点将构成一个分布式文件系统。
可以理解的是,上述步骤S130中的将视频帧进行渲染有两种实施方式,这两种实施方式包括:步骤S133和步骤S134;在上述步骤S130之后的将渲染后的视频帧进一步处理有两种实施方式,这两种实施方式包括:步骤S135和步骤S136,这里将视频帧进行渲染的两种实施方式其中的任一种可以与将渲染后的视频帧进一步处理的两种方式的任一种进行组合,具体的组合方式包括:
第一种组合方式,步骤S133和步骤S135组合:使用开放图形库接口将视频帧渲染至应用程序窗口,并使用应用程序窗口将渲染后的视频帧发送给终端设备。
第二种组合方式,步骤S133和步骤S136组合:使用开放图形库接口将视频帧渲染至应用程序窗口,并使用应用程序窗口将渲染后的视频帧存储至视频数据文件。
第三种组合方式,步骤S134和步骤S135组合:使用网页即时通信接口将视频帧渲染至浏览器窗口,并使用浏览器窗口将渲染后的视频帧发送给终端设备。
第四种组合方式,步骤S134和步骤S136组合:使用网页即时通信接口将视频帧渲染至浏览器窗口,并使用浏览器窗口将渲染后的视频帧存储至视频数据文件。
也就是说,上述将视频帧进行渲染的两种实施方式其中的任一种可以与将渲染后的视频帧进一步处理的两种方式的任一种进行组合,共有四种组合方式,组合方式中的任一步骤的具体实施原理与组合前的步骤实施原理相同或相似,因此,这里不再对组合方式中的任一步骤的实施方式赘述。在上述的实现过程中,使用第一程序将获得的视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序;使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染;也就是说,通过第一程序(例如C++)和第二程序(例如JavaScript)共享同一个内存池来缓存(buffer)视频数据,减少了操作系统在内存中回收程序对象时不断地分配和释放内存的操作,有效地提高了第一程序和第二程序之间的交互效率,从而有效地改善了在不同类型的程序之间传输视频数据和渲染视频数据的速度非常慢的问题。
在具体的实施过程中,上述的视频渲染方法可以使用在Electron框架下,从而提高将视频帧从C++程序模块传输至JavaScript程序模块中的性能,具体例如:使用高效的C++程序采集视频帧图像,并将视频帧图像进行处理后放入共享的内存池buff中,然后再使用node.js库中的JavaScript程序从共享的内存池buff中取出该视频帧图像,有效地减少了node.js对内存进行交互的操作,从而极大地提高了通过electron中的node.js对视频数据进行传输的性能。可以理解的是,此处的共享内存是为了减少node.js和JavaScript对视频帧图像进行移动等操作而设置的,上述的C++程序中的内存释放条件是依赖于JavaScript对象是否使用完的,也就是说,如果JavaScript对象不被操作系统回收,相应的C++程序中的内存也不会被回收;如果JavaScript对象占满内存导致JavaScript对象被操作系统回收,那么相应的C++程序中的内存就会被操作系统回收。上述内存池buff的作用是为了减少内存使用总量和频繁申请,释放内存造成操作系统性能的消耗。
综上所述,在视频帧从C++程序模块传输至JavaScript程序模块的过程中,结合上述的共享内存和内存池buff,在传输过程中设置共享内存池buff来加速视频帧从C++程序模块传输至JavaScript程序模块的过程,从而充分利用C++模块的高效性进行音视频数据的采集和处理,然后高效的传输到前端JS模块进行视频帧画面的数据渲染,极大地提高了Electron框架应用在音频视频场景的适配性。
请参见图2示出的本申请实施例提供的电子设备与终端设备交互的流程示意图;可选地,执行上述视频渲染方法的电子设备还可以与终端设备进行交互,即该电子设备还可以为终端设备提供视频渲染服务,那么电子设备与终端设备交互的过程可以包括如下步骤:
步骤S210:电子设备接收终端设备发送的视频帧,视频帧是视频流数据中的一帧图像。
上述步骤S210中的电子设备接收终端设备发送的视频帧的实施方式包括:电子设备通过超文本传输协议(Hyper Text Transfer Protocol,HTTP)和超文本传输安全协议(Hyper Text Transfer Protocol Secure,HTTPS)接收终端设备发送的视频帧;其中,这里的HTTP是一个简单的请求响应协议,HTTP协议通常运行在传输控制协议(TransmissionControl Protocol,TCP)之上的协议;这里的HTTPS又被称为HTTP Secure,是一种通过计算机网络进行安全通信的传输协议;HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
步骤S220:电子设备使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序。
步骤S230:电子设备使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染,获得渲染后的视频帧。
其中,该步骤S220至步骤S230的实施原理和实施方式与步骤S120至步骤S130的实施原理和实施方式是相似或类似的,因此,这里不再对该步骤的实施方式和实施原理进行说明,如有不清楚的地方,可以参考对步骤S120至步骤S130的描述。
步骤S240:电子设备向终端设备发送渲染后的视频帧。
上述步骤S240中的电子设备向终端设备发送渲染后的视频帧的实施方式例如:电子设备通过HTTP协议或者HTTPS协议向终端设备发送渲染后的视频帧。
请参见图3示出的本申请实施例提供的视频渲染装置的结构示意图;本申请实施例提供了一种视频渲染装置300,包括:
视频帧获得模块310,用于获得视频帧,视频帧为视频数据中的其中一帧图像。
索引号转发模块320,用于使用第一程序将视频帧存储至预先申请的内存池,在内存池中获得视频帧对应的索引号,并将索引号转发给第二程序,第一程序的类型与第二程序的类型不相同,第一程序与第二程序均运行于预设应用环境中。
视频帧渲染模块330,用于使用第二程序根据第一程序转发的索引号获取视频帧,并将视频帧进行渲染。
可选地,在本申请实施例中,视频渲染装置,还包括:
内存申请分配模块,用于使用第一程序向操作系统申请分配内存块。
内存地址获得模块,用于使用第一程序获得操作系统分配的内存块对应的内存地址。
在本申请实施例中,索引号转发模块,包括。
视频帧存储模块,用于使用第一程序将视频帧存储至预先分配的内存块。
索引号获取模块,用于使用第一程序在内存池中获取内存块的内存地址对应的索引号。
可选地,在本申请实施例中,视频帧渲染模块,包括。
内存地址查找模块,用于使用第二程序在内存池中查找与索引号对应的内存块的内存地址。
程序读取视频模块,用于使用第二程序从内存地址对应的内存块中读取视频帧。
可选地,在本申请实施例中,视频帧渲染模块,包括:
视频窗口渲染模块,用于使用开放图形库接口将视频帧渲染至应用程序窗口;或者使用网页即时通信接口将视频帧渲染至浏览器窗口。
可选地,在本申请实施例中,视频帧获得模块,包括:
视频接收解析模块,用于使用预先注册的驱动程序接收终端设备发送的视频帧;或者使用开源计算机视觉库从视频数据文件中解析出视频帧。
可选地,在本申请实施例中,视频渲染装置,还包括:
视频发送存储模块,用于若使用预先注册的驱动程序接收终端设备发送的视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧发送给终端设备;或者若使用开源计算机视觉库从视频数据文件中解析出视频帧,则在将视频帧进行渲染之后,将渲染后的视频帧存储至视频数据文件。
应理解的是,该装置与上述的视频渲染方法实施例对应,能够执行上述方法实施例涉及的各个步骤,该装置具体的功能可以参见上文中的描述,为避免重复,此处适当省略详细描述。该装置包括至少一个能以软件或固件(firmware)的形式存储于存储器中或固化在装置的操作系统(operating system,OS)中的软件功能模块。
请参见图4示出的本申请实施例提供的电子设备的结构示意图。本申请实施例提供的一种电子设备400,包括:处理器410和存储器420,存储器420存储有处理器410可执行的机器可读指令,机器可读指令被处理器410执行时执行如上的方法。
本申请实施例还提供了一种存储介质430,该存储介质430上存储有计算机程序,该计算机程序被处理器410运行时执行如上的方法。
其中,存储介质430可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(Static Random Access Memory,简称SRAM),电可擦除可编程只读存储器(Electrically Erasable Programmable Read-Only Memory,简称EEPROM),可擦除可编程只读存储器(Erasable Programmable Read Only Memory,简称EPROM),可编程只读存储器(Programmable Red-Only Memory,简称PROM),只读存储器(Read-Only Memory,简称ROM),磁存储器,快闪存储器,磁盘或光盘。
本申请实施例所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其他的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请实施例的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请实施例各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。
以上的描述,仅为本申请实施例的可选实施方式,但本申请实施例的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请实施例揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请实施例的保护范围之内。

Claims (10)

1.一种视频渲染方法,其特征在于,包括:
获得视频帧,所述视频帧为视频数据中的其中一帧图像;
使用第一程序将所述视频帧存储至预先申请的内存池,在所述内存池中获得所述视频帧对应的索引号,并将所述索引号转发给第二程序,所述第一程序的类型与所述第二程序的类型不相同,所述第一程序与所述第二程序均运行于预设应用环境中;
使用所述第二程序根据所述第一程序转发的所述索引号获取所述视频帧,并将所述视频帧进行渲染。
2.根据权利要求1所述的方法,其特征在于,在所述使用第一程序将所述视频帧存储至预先申请的内存池,在所述内存池中获得所述视频帧对应的索引号之前,还包括:
使用所述第一程序向操作系统申请分配内存块;
使用所述第一程序获得所述操作系统分配的内存块对应的内存地址;
所述使用第一程序将所述视频帧存储至预先申请的内存池,在所述内存池中获得所述视频帧对应的索引号,包括:
使用所述第一程序将所述视频帧存储至预先分配的内存块;
使用所述第一程序在所述内存池中获取所述内存块的内存地址对应的索引号。
3.根据权利要求2所述的方法,其特征在于,所述使用所述第二程序根据所述第一程序转发的所述索引号获取所述视频帧,包括:
使用所述第二程序在所述内存池中查找与所述索引号对应的内存块的内存地址;
使用所述第二程序从所述内存地址对应的内存块中读取所述视频帧。
4.根据权利要求1所述的方法,其特征在于,所述将所述视频帧进行渲染,包括:
使用开放图形库接口将所述视频帧渲染至应用程序窗口;或者
使用网页即时通信接口将所述视频帧渲染至浏览器窗口。
5.根据权利要求1所述的方法,其特征在于,所述获得视频帧,包括:
使用预先注册的驱动程序接收终端设备发送的所述视频帧;或者
使用开源计算机视觉库从视频数据文件中解析出所述视频帧。
6.根据权利要求5所述的方法,其特征在于,还包括:
若使用预先注册的驱动程序接收终端设备发送的所述视频帧,则在所述将所述视频帧进行渲染之后,将渲染后的所述视频帧发送给所述终端设备;或者
若使用开源计算机视觉库从视频数据文件中解析出所述视频帧,则在所述将所述视频帧进行渲染之后,将渲染后的所述视频帧存储至所述视频数据文件。
7.一种视频渲染装置,其特征在于,包括:
视频帧获得模块,用于获得视频帧,所述视频帧为视频数据中的其中一帧图像;
索引号转发模块,用于使用第一程序将所述视频帧存储至预先申请的内存池,在所述内存池中获得所述视频帧对应的索引号,并将所述索引号转发给第二程序,所述第一程序的类型与所述第二程序的类型不相同,所述第一程序与所述第二程序均运行于预设应用环境中;
视频帧渲染模块,用于使用所述第二程序根据所述第一程序转发的所述索引号获取所述视频帧,并将所述视频帧进行渲染。
8.根据权利要求7所述的装置,其特征在于,所述视频渲染装置,还包括:
内存申请分配模块,用于使用所述第一程序向操作系统申请分配内存块;
内存地址获得模块,用于使用所述第一程序获得所述操作系统分配的内存块对应的内存地址;
所述索引号转发模块,包括;
视频帧存储模块,用于使用所述第一程序将所述视频帧存储至预先分配的内存块;
索引号获取模块,用于使用所述第一程序在所述内存池中获取所述内存块的内存地址对应的索引号。
9.一种电子设备,其特征在于,包括:处理器和存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述机器可读指令被所述处理器执行时执行如权利要求1至6任一所述的方法。
10.一种存储介质,其特征在于,该存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如权利要求1至6任一所述的方法。
CN202010846601.XA 2020-08-20 2020-08-20 一种视频渲染方法、装置、电子设备及存储介质 Pending CN112004147A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010846601.XA CN112004147A (zh) 2020-08-20 2020-08-20 一种视频渲染方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010846601.XA CN112004147A (zh) 2020-08-20 2020-08-20 一种视频渲染方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN112004147A true CN112004147A (zh) 2020-11-27

Family

ID=73473425

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010846601.XA Pending CN112004147A (zh) 2020-08-20 2020-08-20 一种视频渲染方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN112004147A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113268302A (zh) * 2021-05-27 2021-08-17 杭州灵伴科技有限公司 一种头戴式显示设备的显示模式切换方法、装置
CN116233520A (zh) * 2023-05-06 2023-06-06 海马云(天津)信息技术有限公司 传递和获取视频数据的方法及装置、服务器设备和存储介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2006098843A2 (en) * 2005-03-11 2006-09-21 Chicago Mercantile Exchange, Inc. System and method of utilizing a distributed order book in an electronic trade match engine
CN101807289A (zh) * 2010-03-15 2010-08-18 深圳市中钞科信金融科技有限公司 一种用于分布式图像处理系统的建模方法
CN104268012A (zh) * 2014-09-28 2015-01-07 广州华多网络科技有限公司 一种图片数据处理方法及装置
CN104836715A (zh) * 2014-02-08 2015-08-12 国际商业机器公司 在移动设备上运行的多个应用之间共享数据的方法和装置
CN109213613A (zh) * 2018-08-27 2019-01-15 Oppo广东移动通信有限公司 图像信息的传输方法、装置、存储介质及电子设备

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2006098843A2 (en) * 2005-03-11 2006-09-21 Chicago Mercantile Exchange, Inc. System and method of utilizing a distributed order book in an electronic trade match engine
CN101807289A (zh) * 2010-03-15 2010-08-18 深圳市中钞科信金融科技有限公司 一种用于分布式图像处理系统的建模方法
CN104836715A (zh) * 2014-02-08 2015-08-12 国际商业机器公司 在移动设备上运行的多个应用之间共享数据的方法和装置
CN104268012A (zh) * 2014-09-28 2015-01-07 广州华多网络科技有限公司 一种图片数据处理方法及装置
CN109213613A (zh) * 2018-08-27 2019-01-15 Oppo广东移动通信有限公司 图像信息的传输方法、装置、存储介质及电子设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113268302A (zh) * 2021-05-27 2021-08-17 杭州灵伴科技有限公司 一种头戴式显示设备的显示模式切换方法、装置
CN116233520A (zh) * 2023-05-06 2023-06-06 海马云(天津)信息技术有限公司 传递和获取视频数据的方法及装置、服务器设备和存储介质

Similar Documents

Publication Publication Date Title
US11017506B2 (en) Video enhancement using a generator with filters of generative adversarial network
CN111433743B (zh) 一种app远程控制方法及相关设备
US20130113833A1 (en) Method and system for rendering images in a remote web browser
US11210769B2 (en) Video enhancement using a recurrent image date of a neural network
CN106453572B (zh) 基于云服务器同步图像的方法及系统
CN107040584B (zh) 客户端下载图片的方法及装置
US11741582B1 (en) Video enhancement using a neural network
CN112653700A (zh) 一种基于webrtc网页视频通信的方法
CN112004147A (zh) 一种视频渲染方法、装置、电子设备及存储介质
CN110290398B (zh) 视频下发方法、装置、存储介质及电子设备
CN112764877B (zh) 一种用于硬件加速设备与docker内进程通信的方法与系统
CN111722885A (zh) 程序运行方法、装置以及电子设备
CN114302176B (zh) 视频播放方法及装置
WO2020227179A1 (en) Video enhancement using a neural network
CN113784049B (zh) 安卓系统虚拟机的摄像头调用方法、电子设备和存储介质
EP4078981B1 (en) Video enhancement service
CN114268796A (zh) 视频流处理的方法及装置
CN112416303A (zh) 软件开发工具包热修复方法、装置及电子设备
CN108959393B (zh) 动态图片处理方法、装置及存储介质
CN113391811A (zh) 函数编译方法、装置、电子设备及计算机可读存储介质
CN111199569A (zh) 数据处理的方法、装置、电子设备及计算机可读介质
CN111111175A (zh) 一种游戏画面生成方法、装置和移动终端
US20170124029A1 (en) System and method of producing dynamically customized images
CN113835816A (zh) 一种虚拟机桌面显示方法、装置、设备及可读存储介质
US20150248347A1 (en) Content providing apparatus and method, and computer program product

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20201127