直播缓存的性能优化方法、系统、电子装置及存储介质

文档序号:196289 发布日期:2021-11-02 浏览:30次 >En<

阅读说明:本技术 直播缓存的性能优化方法、系统、电子装置及存储介质 (Live broadcast cache performance optimization method and system, electronic device and storage medium ) 是由 杨大维 徐小龙 于 2021-08-09 设计创作,主要内容包括:本发明公开了一种直播缓存的性能优化方法、系统、电子装置及存储介质,该方法包括:为直播应用提供调用接口,调用接口用于接收直播应用读缓存或写缓存的指令;对直播应用的每个直播频道,均分配一组内存块,内存块用于存储对应直播频道最新获取的直播数据;为每一个直播频道均提供一个对应的虚拟文件,虚拟文件用于将对应直播频道的直播数据进行封装;通过调用接口,接收直播应用的写缓存指令,打开虚拟文件,向虚拟文件对应的内存块内写入缓存数据;或者,通过调用接口,接收直播应用的读缓存指令,打开虚拟文件,从虚拟文件对应的内存块内读取缓存数据。本发明能够简化缓存的使用,提升直播的并发性能,降低直播延时。(The invention discloses a method, a system, an electronic device and a storage medium for optimizing the performance of live broadcast cache, wherein the method comprises the following steps: providing a calling interface for the live broadcast application, wherein the calling interface is used for receiving a command of reading cache or writing cache of the live broadcast application; allocating a group of memory blocks to each live broadcast channel applied to live broadcast, wherein the memory blocks are used for storing newly acquired live broadcast data corresponding to the live broadcast channels; providing a corresponding virtual file for each live channel, wherein the virtual file is used for packaging live data of the corresponding live channel; receiving a write cache instruction of live broadcast application through a calling interface, opening a virtual file, and writing cache data into a memory block corresponding to the virtual file; or receiving a cache reading instruction of the live broadcast application through a calling interface, opening the virtual file, and reading cache data from a memory block corresponding to the virtual file. The method and the device can simplify the use of the cache, improve the concurrency performance of live broadcasting and reduce the live broadcasting delay.)

直播缓存的性能优化方法、系统、电子装置及存储介质

技术领域

本发明涉及缓存优化技术领域,尤其涉及一种直播缓存的性能优化方法、系统、电子装置及存储介质。

背景技术

随着科技的发展了,直播已经成为我们生活不可或缺的一部分,如在线教育,视频会议,大型晚会直播,培训直播,赛事直播等。

由于网络带宽的增加,参与观看直播的观众也越来越多,直播的并发越来越高,对直播的时延要求也越来越高。

现有的一些直播系统,缓存系统不通用,应用层的读写操作不便,导致直播的并发性能较差。

发明内容

本发明的主要目的在于提供一种直播缓存的性能优化方法、系统、电子装置及存储介质,旨在解决现有技术中缓存系统不通用,应用层的读写操作不便,导致直播的并发性能较差问题。

为实现上述目的,本发明第一方面提供一种直播缓存的性能优化方法,其特征在于,包括:为直播应用提供调用接口,所述调用接口用于接收所述直播应用读缓存或写缓存的指令;对所述直播应用的每个直播频道,均分配一组内存块,所述内存块用于存储对应直播频道最新获取的直播数据;为每一个所述直播频道均提供一个对应的虚拟文件,所述虚拟文件用于将对应直播频道的直播数据进行封装;通过所述调用接口,接收所述直播应用的写缓存指令,打开所述虚拟文件,向所述虚拟文件对应的所述内存块内写入缓存数据;或者,通过所述调用接口,接收所述直播应用的读缓存指令,打开所述虚拟文件,从所述虚拟文件对应的所述内存块内读取缓存数据。

其中,所述向所述虚拟文件对应的所述内存块内写入缓存数据包括:对于最新的直播数据,获取需要写入的一帧数据;确定需要写入的一帧数据应当写入的内存块位置;根据内存块位置在相应内存块内写入相应的一帧数据;按照时序,将最新的直播数据的每帧数据均写入所述内存块内。

其中,所述在该内存块内写入该一帧数据包括:获取需要写入的一帧数据的写索引值、帧数组大小的第一数值;使用所述写索引值以所述第一数值,得到的商的余数,作为将要写入的一帧数据应当写入的内存块的存储区的编号位置;将该一帧数据写入所述编号位置对应的内存块。

其中,所述在该内存块内写入一帧数据后,所述向所述虚拟文件对应的所述内存块内写入缓存数据还包括:在根据所述帧数组将写入的一帧数据指向新的内存块时,使用所述帧类型数组将写入的内存块的位置设置为新的帧类型,并记录该位置内存块的帧类型,且将所述帧数组在将已经写入的直播数据指向的旧内存块释放,且将所述写索引值加一。

其中,所述从所述虚拟文件对应的所述内存块内读取缓存数据包括:确定需要读取的一帧数据所属的内存块位置;根据所述一帧数据所属的内存块位置在相应内存块中读取所述一帧数据;按照时序,从相应的内存块中读取直播数据的每帧数据。

其中,所述确定需要读取的一帧数据所述的内存块位置包括:记录需要读取的一帧数据的读索引值,所述读索引值初始值为零;计算所述读索引值的一帧数据,进行写缓存及读缓存时的时间差值,得到延时数据;通过所述延时数据和预设的跳帧阈值,判断是否要跳帧读取所述直播数据;若是,则确定跳帧后需要读取的一帧数据对应的位置;若否,则确定当前读取的一帧数据对应的位置。

其中,所述则确定跳帧后需要读取的一帧数据对应的位置包括:获取一帧离当前读取的一帧数据最近的相邻帧数据;将所述相邻帧数据对应的位置,赋予所述读索引值,根据读索引值及帧数据数组计算需要读取的一帧数据对应的位置。在从所述内存块中读取一帧数据后,所述从所述虚拟文件对应的所述内存块内读取缓存数据还包括:将所述读索引值加一,以进行下一帧数据从所述虚拟文件对应的所述内存块内读取缓存数据。

本申请第二方面提供一种直播缓存的性能优化系统,包括:应用接口层模块,用于为直播应用提供调用接口,所述调用接口用于接收所述直播应用读缓存或写缓存的指令;内存频道层模块,用于对所述直播应用的每个直播频道,均分配一组内存块,所述内存块用于存储对应直播频道最新获取的直播数据;虚拟文件层模块,用于为每一个所述直播频道均提供一个对应的虚拟文件;数据写入模块,用于通过所述调用接口,接收所述直播应用的写缓存指令,打开所述虚拟文件,向所述虚拟文件对应的所述内存块内写入缓存数据;数据读取模块,用于通过所述调用接口,接收所述直播应用的读缓存指令,打开所述虚拟文件,从所述虚拟文件对应的所述内存块内读取缓存数据。

本申请第三方面提供一种电子装置,包括:存储器、处理器,所述存储器上存储有可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述中的任意一项所述直播缓存的性能优化方法。

本申请第四方面提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现上述中的任意一项所述直播缓存的性能优化方法。

本发明提供一种直播缓存的性能优化方法、系统、电子装置及存储介质,有益效果在于:提供了统一的调用接口,方便直播应用所在的应用层使用,提升了直播系统的可维护性和可靠性,从而可简化缓存的使用,提升直播的并发性,降低直播延时。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请一实施例直播缓存的性能优化方法的流程示意图;

图2为本申请一实施例直播缓存的性能优化方法的向虚拟文件对应的内存块内写入缓存数据的流程示意图;

图3为本申请一实施例直播缓存的性能优化方法的在内存块内缓存写入的一帧数据对应的所有直播数据的流程示意图;

图4为本申请一实施例直播缓存的性能优化方法的从虚拟文件对应的内存块内读取缓存数据的流程示意图;

图5为本申请一实施例直播缓存的性能优化方法的确定读取的一帧数据的内存块的流程示意图;

图6为本申请一实施例直播缓存的性能优化系统的结构示意框图;

图7为本申请一实施例电子装置的结构示意框图。

具体实施方式

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅图1,为一种直播缓存的性能优化方法,包括:

S101、为直播应用提供调用接口,调用接口用于接收直播应用读缓存或写缓存的指令;

S102、对直播应用的每个直播频道,均分配一组内存块,内存块用于存储对应直播频道最新获取的直播数据;

S103、为每一个直播频道均提供一个对应的虚拟文件,虚拟文件用于将对应直播频道的直播数据进行封装;

S104、通过调用接口,接收直播应用的写缓存指令,打开虚拟文件,向虚拟文件对应的内存块内写入缓存数据;

S105、通过调用接口,接收直播应用的读缓存指令,打开虚拟文件,从虚拟文件对应的内存块内读取缓存数据。

在步骤S101中,调用接口至少有四个,分别为Open,Write,Read,Close接口。

Open接口用于打开一个虚拟文件,传入直播频道url作为参数,打开成功,将返回一个虚拟文件ID。

Read接口用于读取最新的直播频道数据,传入虚拟文件ID,返回一个完整的帧block数据。当应用层没有及时的调用Read接口,导致数据有时延时,直播缓存系统会自动跳过过期数据,从最新的位置点返回,确保直播的低时延。

Write接口用于写入最新的直播数据,传入虚拟文件ID和一个完整的帧block。

Close接口用于关闭虚拟文件,释放资源。

在步骤S102中,首先有一个内存频道(MemChannel),内存频道有两个固定大小的数组,分别为FData(帧数据数组)和FType(帧类型数组),FType为int类型的数组,记录视频帧类型(如I,P,B帧);FData为Block指针类型的数组,指向Block缓存块。Block缓存块缓存一个完整的帧数据。

内存频道有一个写索引值write_idx,记录视频数据的写位置,当写数据时,需要通过write_idx转换到数组的下标。如数组大小为100,当前write_idx为120,则写入位置为120除以100取余数,即写入位置为20,FData数组的20位置指向新的Block,原位置的Block设置为空闲Block。

FType数组记录FData对于位置点的帧类型,用于丢帧时寻找I帧。

在步骤S103中,使用虚拟文件层提供虚拟文件,每个用户想要读写直播频道的数据,需要打开一个虚拟文件VirtualFile,并通过文件ID进行操作。

在步骤S104及步骤S105中,通过网络传输层进行数据的传输,比如通过HTTP的chunck方式传输,一个帧数据打包成一个chunck,接收端接收到一个chunck,便知道是一帧数据,并且知道帧类型,接收端不需要重新进行帧数据的对齐和帧类型判断,提高了接收端的效率。Chunck传输时,Chunck数据的最后一字用来记录帧类型。发送端发送chunck数据时,添加该字节;接收端接收数据时,通过该字节判断帧类型,保存到Block时,去掉该字节。

由于网络传输层按数据帧对其和帧类型的方式对直播数据进行传输,因此能够降低直播的延时。

在本实施例中,需要缓存的直播数据可以是TS封装的音视频数据,也可以是按一定格式封装的裸数据;另外,本实施例提供的直播缓存的性能优化方法,可以布置在电子设备的window系统、Linux系统、Unix系统等,优选地,本申请实施例的直播缓存的性能优化方法,布置在Linux系统。

在本实施例中,提供了统一的调用接口,方便直播应用所在的应用层使用,提升了直播系统的可维护性和可靠性,从而可简化缓存的使用,提升直播的并发性能,降低直播延时。

另外,用http chunck方式按视频帧和帧类型的方式传输,简化了接收端要解析数据进行帧组装的CPU消耗,提升系统性能,提升并发。

请参阅图2,在一个实施例中,步骤S104中,向虚拟文件对应的内存块内写入缓存数据包括:

S1041、对于最新的直播数据,获取需要写入的一帧数据;

S1042、确定写入的一帧数据应当写入的内存块位置;

S1043、根据内存块位置在相应内存块内写入相应的一帧数据;

S1044、按照时序,将最新的直播数据的每帧数据均写入所述内存块内。

在打开一个虚拟文件后,传入频道的url作为唯一参数。打开成功后会返回一个文件ID,后续的操作都要携带该文件ID。VirtualFile会关联一个MemChannel。

随后会调用Write接口写入一帧数据,输入参数为Block和帧类型。

请参阅图3,在一个实施例中,步骤S1043,在该内存块内写入该一帧数据包括:

S10431、获取需要写入的一帧数据的写索引值、帧数组大小的第一数值;

S10432、使用写索引值以第一数值,得到的商的余数,作为将要写入的一帧数据应当写入的内存块的存储区的编号位置;

S10433、将该一帧数据写入编号位置对应的内存块。

MemChannel通过write_idx确定写位置。具体地,实现步骤S10432时,举例如下,假设FData数组大小100,当前write_idx为120,则写位置为120除以100取余,得到20,20即为写入的一帧数据应当写入的内存块的存储区的编号位置。

在一个实施例中,步骤S104中,在该内存块内写入一帧数据后,向虚拟文件对应的内存块内写入缓存数据还包括:

S1044、在根据帧数组将写入的一帧数据指向新的内存块时,使用帧类型数组将写入的内存块的位置设置为新的帧类型,并记录该位置内存块的帧类型,且将帧数组在将已经写入的直播数据指向的旧内存块释放,且将写索引值加一。

请参阅图4,在一个实施例中,在步骤S105中,从虚拟文件对应的内存块内读取缓存数据包括:

S1051、确定需要读取的一帧数据所属的内存块位置;

S1052、根据一帧数据所属的内存块位置在相应内存块中读取一帧数据;

S1053、按照时序,从相应的内存块中读取直播数据的每帧数据。

在本实施例中,打开一个VirtualFile文件,传入频道的url作为唯一参数。打开成功后会返回一个文件ID,后续的操作都要携带该文件ID。VirtualFile会关联一个MemChannel。需要read接口读一帧数据。

请参阅图5,在一个实施例中,步骤S1052,确定需要读取的一帧数据的内存块位置包括:

S10521、记录需要读取的一帧数据的读索引值,读索引值初始值为零;

S10522、计算读索引值的一帧数据,进行写缓存及读缓存时的时间差值,得到延时数据;

S10523、通过延时数据和预设的跳帧阈值,判断是否要跳帧读取直播数据;

S10524、若是,则确定跳帧后需要读取的一帧数据对应的位置;

S10525、若否,则确定当前读取的一帧数据对应的位置。

VirtualFile维护一个读索引read_idx,read_idx初始值为0。VirtualFile通过read_idx,向MemChannel读取数据。

在步骤S10523中,MemChannel通过read_idx和write_idx来判断延时。如write_idx减去read_idx等于10,表示有10帧数据的延时。

判断时延是否大于配置的阈值,如果大于阈值,则启动跳帧;这种跳帧,能够始终保持直播的低延时,从而降低了直播的延时。

在一个实施例中,步骤S10524中,则确定跳帧后需要读取的一帧数据对应的位置包括:获取一帧离当前读取的一帧数据最近的相邻帧数据;将相邻帧数据对应的位置,赋予读索引值,根据读索引值及帧数据数组计算需要读取的一帧数据对应的位置。

跳帧时,找到一个离write_idx位置最近的I帧数据,并把该位置赋给read_idx。

在本实施例中,在网络不好的情况下,采用快速丢帧的方式,降低直播时延,同时不会出现马赛克,提升用户体验。

在根据读索引值及帧数据数组计算需要读取的一帧数据对应的位置时,方法与获取写缓存时,确定需要写入的一帧数据对应的位置相同,具体可包括:获取读取的一帧数据的写索引值、帧数组大小的第二数值;使用写索引值除以第二数值,得到的商的余数,作为读取的一帧数据应当去读的内存块的存储区的编号位置;将所有的直播数据从编号位置对应的内存块读取。

在步骤S105中,在从内存块中读取一帧数据后,从虚拟文件对应的内存块内读取缓存数据还包括:S1054、将读索引值加一,以进行下一帧数据从虚拟文件对应的内存块内读取缓存数据。

请参阅图6,在一个实施例中,本申请还提供一种直播缓存的性能优化系统,包括:应用接口层模块1、虚拟文件层模块2、内存频道层模块3及数据写入模块4、数据读取模块5;应用接口层模块1用于为直播应用提供调用接口,调用接口用于接收直播应用读缓存或写缓存的指令;虚拟文件层模块2用于为每一个直播频道均提供一个对应的虚拟文件;内存频道层模块3用于对直播应用的每个直播频道,均分配一组内存块,内存块用于存储对应直播频道最新获取的直播数据;数据写入模块4用于通过调用接口,接收直播应用的写缓存指令,打开虚拟文件,向虚拟文件对应的内存块内写入缓存数据;数据读取模块用于通过调用接口,接收直播应用的读缓存指令,打开虚拟文件,从虚拟文件对应的内存块内读取缓存数据。

在本实施例中,通过网络传输层进行直播数据的传输,将直播数据从直播频道传输至接收端的数据写入模块,比如通过HTTP的chunck方式传输,一个帧数据打包成一个chunck,接收端接收到一个chunck,便知道是一帧数据,并且知道帧类型,接收端不需要重新进行帧数据的对齐和帧类型判断,提高了接收端的效率。Chunck传输时,Chunck数据的最后一字用来记录帧类型。发送端发送chunck数据时,添加该字节;接收端接收数据时,通过该字节判断帧类型,保存到Block时,去掉该字节。

由于网络传输层按数据帧对其和帧类型的方式对直播数据进行传输,因此能够降低直播的延时。

本实施例的直播缓存的性能优化系统,提供了统一的调用接口,方便直播应用所在的应用层使用,提升了直播系统的可维护性和可靠性,从而可提升直播的并发性。

在一个实施例中,网络传输层模块4包括:第一数据写入单元、写入内存确定单元及第二数据写入单元;第一数据写入单元用于对于最新的直播数据,获取需要写入的一帧数据;写入内存确定单元用于确定需要写入的一帧数据应当写入的内存块位置;第二数据写入单元用于根据内存块位置在相应内存块内写入相应的一帧数据,并按照时序,将最新的直播数据的每帧数据均写入所述内存块内。

在一个实施例中,第二数据写入单元包括:数值获取子单元、第一计算子单元及直播数据写入单元;数值获取子单元用于获取需要写入的一帧数据的写索引值、帧数组大小的第一数值;第一计算子单元用于使用写索引值除以第一数值,得到的商的余数,作为将要写入的一帧数据应当写入的内存块的存储区的编号位置;直播数据写入单元用于将该一帧数据写入编号位置对应的内存块。

数据写入模块4还包括:帧类型记录模块,用于在根据帧数组将写入的一帧数据指向新的内存块时,使用帧类型数组将写入的内存块的位置设置为新的帧类型,并记录该位置内存块的帧类型,且将帧数组在将已经写入的直播数据指向的旧内存块释放,且将写索引值加一。

在一个实施例中,数据读取模块5包括:读取内存确定单元及第二数据读取单元;读取内存确定单元用于确定需要读取的一帧数据所属的内存块位置;第二数据读取单元用于根据一帧数据所属的内存块位置在相应内存块中读取一帧数据,并按照时序,从相应的内存块中读取直播数据的每帧数据。

在一个实施例中,读取内存确定单元包括:数值记录子单元、第二计算子单元、判断子单元、位置确定子单元;数值记录子单元用于记录需要读取的一帧数据的读索引值,读索引值初始值为零;第二计算子单元用于计算读索引值的一帧数据,进行写缓存及读缓存时的时间差值,得到延时数据;判断子单元用于通过延时数据和预设的跳帧阈值,判断是否要跳帧读取直播数据;位置确定子单元用于若判断子单元判断要跳帧,则确定跳帧后需要读取的一帧数据对应的位置;还用于若判断子单元判断不需要跳帧若否,则确定当前读取的一帧数据对应的位置。

在一个实施例中,位置确定子单元还用于:获取一帧离当前读取的一帧数据最近的相邻帧数据;将相邻帧数据对应的位置,赋予读索引值,根据读索引值及帧数据数组计算需要读取的一帧数据对应的位置。

在一个实施例中,网络传输层模块4还包括累加单元,用于将读索引值加一,以进行下一帧数据从虚拟文件对应的内存块内读取缓存数据。

本申请实施例提供一种电子装置,请参阅图7,该电子装置包括:存储器601、处理器602及存储在存储器601上并可在处理器602上运行的计算机程序,处理器602执行该计算机程序时,实现前述中描述的直播缓存的性能优化方法。

进一步的,该电子装置还包括:至少一个输入设备603以及至少一个输出设备604。

上述存储器601、处理器602、输入设备603以及输出设备604,通过总线605连接。

其中,输入设备603具体可为摄像头、触控面板、物理按键或者鼠标等等。输出设备604具体可为显示屏。

存储器601可以是高速随机存取记忆体(RAM,Random Access Memory)存储器,也可为非不稳定的存储器(non-volatile memory),例如磁盘存储器。存储器601用于存储一组可执行程序代码,处理器602与存储器601耦合。

进一步的,本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是设置于上述各实施例中的电子装置中,该计算机可读存储介质可以是前述中的存储器601。该计算机可读存储介质上存储有计算机程序,该程序被处理器602执行时实现前述实施例中描述的直播缓存的性能优化方法。

进一步的,该计算机可存储介质还可以是U盘、移动硬盘、只读存储器601(ROM,Read-Only Memory)、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。

所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。

以上为对本发明所提供的一种直播缓存的性能优化方法、系统、电子装置及存储介质的描述,对于本领域的技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。

16页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种直播间交互方法、装置及直播服务器

网友询问留言

已有0条留言

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

精彩留言,会给你点赞!

技术分类