CN110971921B - 一种礼物消息的降级方法及相关装置 - Google Patents

一种礼物消息的降级方法及相关装置 Download PDF

Info

Publication number
CN110971921B
CN110971921B CN201811161526.2A CN201811161526A CN110971921B CN 110971921 B CN110971921 B CN 110971921B CN 201811161526 A CN201811161526 A CN 201811161526A CN 110971921 B CN110971921 B CN 110971921B
Authority
CN
China
Prior art keywords
message
time
gift
information
queue
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.)
Active
Application number
CN201811161526.2A
Other languages
English (en)
Other versions
CN110971921A (zh
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.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu 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 Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201811161526.2A priority Critical patent/CN110971921B/zh
Publication of CN110971921A publication Critical patent/CN110971921A/zh
Application granted granted Critical
Publication of CN110971921B publication Critical patent/CN110971921B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/20Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
    • H04N21/21Server components or server architectures
    • H04N21/218Source of audio or video content, e.g. local disk arrays
    • H04N21/2187Live feed
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/20Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
    • H04N21/23Processing of content or additional data; Elementary server operations; Server middleware
    • H04N21/235Processing of additional data, e.g. scrambling of additional data or processing content descriptors
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/20Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
    • H04N21/23Processing of content or additional data; Elementary server operations; Server middleware
    • H04N21/239Interfacing the upstream path of the transmission network, e.g. prioritizing client content requests
    • H04N21/2393Interfacing the upstream path of the transmission network, e.g. prioritizing client content requests involving handling client requests
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N21/00Selective content distribution, e.g. interactive television or video on demand [VOD]
    • H04N21/20Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
    • H04N21/25Management operations performed by the server for facilitating the content distribution or administrating data related to end-users or client devices, e.g. end-user or client device authentication, learning user preferences for recommending movies
    • H04N21/258Client or end-user data management, e.g. managing client capabilities, user preferences or demographics, processing of multiple end-users preferences to derive collaborative data
    • H04N21/25866Management of end-user data
    • H04N21/25891Management of end-user data being end-user preferences
    • 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/431Generation of visual interfaces for content selection or interaction; Content or additional data rendering
    • H04N21/4312Generation of visual interfaces for content selection or interaction; Content or additional data rendering involving specific graphical features, e.g. screen layout, special fonts or colors, blinking icons, highlights or animations
    • 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/442Monitoring of processes or resources, e.g. detecting the failure of a recording device, monitoring the downstream bandwidth, the number of times a movie has been viewed, the storage space available from the internal hard disk
    • H04N21/4424Monitoring of the internal components or processes of the client device, e.g. CPU or memory load, processing speed, timer, counter or percentage of the hard disk space used
    • 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/47End-user applications
    • H04N21/482End-user interface for program selection

Abstract

本发明实施例公开了一种礼物消息的降级方法及相关装置,用于在降级礼物消息时,实现了根据礼物消息的等级进行选择性降级的目的。本发明实施例方法包括:通过调用http的get函数向服务器发送直播间请求信息;接收服务器返回的直播间信息,直播间信息包括第一阈值;当接收到消息时,将接收到消息的时刻存储到时刻队列中,时刻队列用于存储接收消息的时刻;判断时刻队列中存储的时刻数量是否超过第一阈值;若超过,则解析时刻队列中的各时刻对应的消息是否为礼物消息并获取礼物消息的等级信息;若时刻队列中的各时刻对应的消息中存在礼物消息时,获取礼物消息的等级信息,并根据礼物消息的等级信息判断礼物消息的等级是否大于预设等级;若不大于,则存储礼物消息的连击次数,并丢弃礼物消息。

Description

一种礼物消息的降级方法及相关装置
技术领域
本发明涉及计算机领域,尤其涉及一种礼物消息的降级方法及相关装置。
背景技术
对于直播平台来说,在一个房间内的所有观众是可以看到该直播间的所有弹幕消息和礼物消息。然而对于大直播间由于消息过多导致移动端的设备的发热,以及性能消耗,会产生卡顿现象。因此在移动端对收到的弹幕和礼物消息进行降级则很有必要。
现有技术中,依据当前时刻设置来统计礼物消息数量,并将在阈值内的礼物消息存入队列中,超过数量则丢弃掉。
然而现有技术中,礼物消息分为高等级礼物消息和低等级礼物消息,在礼物消息量多的时候,高等级礼物消息和低等级礼物消息都会被丢弃,使得发送高等级礼物消息的高级用户体验感不好。因此如何在控制显示层的礼物消息的数量的前提下,优先维护高级用户的权益是一个急需解决的问题。
发明内容
本发明实施例提供了一种礼物消息的降级方法及相关装置,用于在降级礼物消息时,实现了根据礼物消息的等级进行选择性降级的目的。
本发明实施例的第一方面提供了一种礼物消息的降级方法,包括:通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;当接收到消息时,将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;若超过,则解析所述时刻队列中的各时刻对应的消息是否为礼物消息;若所述时刻队列中的各时刻对应的消息中存在礼物消息时,获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;若不大于,则存储所述礼物消息的连击次数,并丢弃所述礼物消息。
在一种可能的实施例中,所述方法还包括:定义消息降级类MessageLimit,所述消息降级类MessageLimit用于对接收到的消息进行降级处理;创建消息解析类SttDecoder,所述消息解析类用于解析所述时刻队列中的各时刻对应的消息是否为礼物消息。
在一种可能的实施例中,所述通过调用http的get函数向服务器发送直播间请求信息包括:定义http对象http objhttp;在所述http对象中填入所述直播间的域名信息和所述直播间的房间号信息;通过所述get函数objhttp.get()将所述直播间请求信息发送给所述服务器。
在一种可能的实施例中,所述解析所述时刻队列中的各时刻对应的消息是否为礼物消息包括:通过Parse函数pDecoder->Parse(NetMessage)解析所述时刻队列中的各时刻对应的消息,所述NetMessage用于表示消息为网络消息;通过string函数std::stringcmdtype=std::string(pDecoder->GetItem(“type”))获取所述时刻队列中的各时刻对应的消息的类型,所述type用于表示消息的类型。
在一种可能的实施例中,所述存储所述礼物消息的连击次数之前,所述方法还包括:根据所述礼物消息的礼物类型获取所述礼物消息的连击次数。
在一种可能的实施例中,所述根据所述礼物消息的礼物类型获取所述礼物消息的连击次数包括:定义迭代器stl::map<int,int>::iterator itr;初始化所述迭代器itr;调用map容器的find函数itr=gifTypeTimes.find(giftype)查找所述礼物消息的礼物类型;若找到所述礼物类型,则所述find函数返回所述礼物消息的连击次数。
在一种可能的实施例中,所述存储所述礼物消息的连击次数包括:通过stl容器的map容器stl::map<int1,int2>gifTypeTimes关联所述礼物消息与所述礼物消息的连击次数,所述int1用于存储所述礼物消息的礼物类型,所述int2用于存储所述礼物消息的连击次数。
本发明实施例的第二方面提供了一种获取装置,包括:收发单元,由于通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;存储单元,当接收到消息时,用于将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;判断单元,用于判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;解析单元,若超过,则用于解析所述时刻队列中的各时刻对应的消息是否为礼物消息;所述判断单元,若所述时刻队列中的各时刻对应的消息中存在礼物消息时,还用于获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;丢弃单元,若不大于,则用于存储所述礼物消息的连击次数,并丢弃所述礼物消息。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的获取数据的方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的获取数据的方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;当接收到消息时,将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;若超过,则解析所述时刻队列中的各时刻对应的消息是否为礼物消息;若所述时刻队列中的各时刻对应的消息中存在礼物消息时,获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;若不大于,则存储所述礼物消息的连击次数,并丢弃所述礼物消息。本发明实施例中,当礼物消息超过第一阈值时,高等级的礼物消息不降级,降级低等级的礼物消息,并存储该低等级的礼物消息的连击次数,用于在降级礼物消息时,实现了根据礼物消息的等级进行选择性降级的目的。
附图说明
图1为本发明实施例提供的一种可能的礼物消息的降级方法的流程图;
图2为本发明实施例提供的一种可能的降级装置的结构示意图;
图3为本发明实施例提供的一种可能的电子设备的硬件结构示意图;
图4为本发明实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。
具体实施方式
本发明实施例提供了一种礼物消息的降级方法及相关装置,用于在降级礼物消息时,实现了根据礼物消息的等级进行选择性降级的目的。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
请参阅图1,为本发明实施例提供的一种礼物消息的降级方法的流程图,具体包括:
101、通过调用http的get函数向服务器发送直播间请求消息;
客户端在进直播间观看时,会从服务器请求直播间的相关信息,包括直播间的视频流地址,房间内的贵族信息等和该直播间主播相关的一些信息等。即客户端通过调用http的get函数向服务器发送直播间请求消息,其中,该直播间请求消息用于请求直播间信息,直播间请求消息包括直播间的域名信息和所述直播间的房间号信息。具体地,首先定义一个http对象:http objhttp;然后填入直播间请求消息的域名url信息和参数信息,例如直播间请求消息的域名url信息可以如下:
objhttp.url=https://douyu.dz11.com/info?roomid=342;
其中url中包含了直播平台的域名信息,以及该直播间的房间号roomid=342。
在得到该http对象后,通过调用http的get函数,例如调用函数objhttp.get()来将请求发送给直播平台服务器。
102、接收服务器返回的直播间信息;
本申请实施例中,为了更好的考虑动态变化性,同时也可以应对实时调整策略,例如在直播平台观看直播间时的礼物消息降级,服务器返回该直播间信息时还加入一个第一阈值,第一阈值用于指示预定时长内接收礼物消息的最大数值。为便于理解,本申请实施例中,该礼物阈值为整数数值DanmuLimit,此值用于给到客户端每秒钟接收弹幕的数量。客户端编写的每秒中的礼物消息数量这个阈值是从服务器下发过来的,从而可以实现服务器随时依据当前情况进行调整,而客户端并不需要发布新的版本。同时还可以支持对于不同的直播间采取不同的阈值,更加灵活高效。
具体的,对应与步骤101中客户端通过调用http的get方法来将直播间请求消息发送给直播平台服务器,则客户端通过http返回的数据得到服务器发送的直播间信息,该直播间信息包括第一阈值,例如第一阈值等于100,即表示每秒钟最多收到100条礼物消息,因此将其赋值给DanmuLimit=100。
103、定义礼物消息降级类;
为了更好的设计和编码,本申请实施例中,采用C++编程语言,来将整个消息降级的功能封装到一个C++的类中,从而可以提供成一个通用的功能,实现更好的代码复用和逻辑的封装。具体地,客户端定义一个礼物消息降级类,该礼物消息降级类用于对接收到的礼物消息进行降级处理,本申请实施例中该礼物消息降级类的类名为MessageLimit类,实现函数如Class MessageLimit{。
另外,本申请实施例中,客户端还会设计一个时刻队列来存储收到礼物消息的时刻,实际应用中可以选取STL容器的list容器作为该时刻队列的数据结构,以实现高效的存入和删除,具体函数实现如下:
std::list<uint64_t>m_item_times;
需要说明的是,本申请实施例中,时刻队列存储的是收到礼物消息的时刻,所以其存储的是一个时间的整数值,该时刻的类型是uint64_t。另外,为存储服务器下发的DanmuLimit阈值,客户端还需要定义一个存储阈值的成员变量size_t m_nLimit,即m_nLimit=DanmuLimit。
104、确定时刻队列中存储的时刻数量是否超过第一阈值;
需要说明的是,客户端还需设计礼物消息降级类的接口信息,函数表现为boolCheck();此接口Check用于收到消息后,确定当前是否消息的数量达到了阈值,如果没有则返回值为true,说明可以进行展示消息;如果达到了阈值,则返回值是false,说明不能存储消息了。
首先我们调用系统函数nowtime获取当前时刻并存储到now变量中,具体函数表示可以如下:
bool Check(){
uint64_t now=(uint64_t)nowtime();
通过调用if函数,如果小于m_nLimit则说明没有达到最大阈值,还可以存储当前时刻,那再调用list的push_back来存储当前时刻now到队列中。并且返回true;说明当前可以展示该条弹幕内容,具体函数表示可以如下:
if(m_item_times.size()<m_nLimit){
m_item_times.push_back(now);};
需要说明的是,客户端还需要判断当前时刻和队列最开头的时刻是否小于1的阈值,如果超过则返回false,即if((now-m_item_times.front())<=1000)urn false;},则返回false,其中1000表示1000毫秒也即是1秒。
105、确定时刻队列中的各时刻对应的消息中存在礼物消息并获取礼物消息的等级信息;
当客户端确定时刻队列中存储的时刻数量超过第一阈值时,解析接收到的消息为礼物消息并获取礼物消息的等级信息,具体实现如下:
需要说明的是,在礼物消息中有字段表明礼物消息的类型和礼物消息的等级。那么客户端在进行降级时,则需要考虑降级低等级的礼物,而对于高等级的礼物则尽量的都展示,从而不会影响用户观看。同时本身低等级的礼物数量也会偏多,而高等级的礼物数目则会偏少。为便于理解,设现有礼物消息如下:
type@=dgb/rid@=229346/giftype@=824/uid@=34135589/nn@=布拉克斯/ic@=avatar@S034@S13@S55@S89_avatar/eid@=0/level@=16/dw@=0/gfcnt@=1/hits@=6/bcnt@=6/bst@=2/ct@=0/el@=/bl@=5/brid@=78561/fc@=0/
其中type@=dgb表示是一条礼物消息,rid@=229346则表示直播间的房间号,giftype@=824则表示礼物的类型,nn@=布拉克斯则表示送礼物的用户的昵称,level@=16则表示礼物的等级等其他的字段信息,具体此处不再一一赘述。
那么则需要对此条礼物消息进行解析,从而获取其中需要的各个字段信息。
首先创建一个消息解析类SttDecoder的实例对象:SttDecoder*pDecoder=newSttDecoder();然后对消息进行解析,pDecoder->Parse(NetMessage);其中NetMessage则表示收到的一条网络消息;解析后获取该条消息的消息类型,std::string cmdtype=std::string(pDecoder->GetItem("type")),其中获取消息字段的type值表示其消息的类型。
通过if函数判断是否是礼物消息,若是礼物消息,则解析其他字段,如通过get函数获取礼物等级level和礼物类型giftype;若不是礼物消息,则直接返回。具体函数实现如下:
If(cmdtype==“dgb”){
Level=pDecoder->GetItemAsInt(“level”)
giftype=pDecoder->GetItemAsInt(“giftype”)
}
Else{
};
其中,dgb用于表示是一条礼物消息。
106、根据礼物消息的等级信息确定该礼物消息的等级不大于预设等级;
107、存储礼物消息的连击次数,并丢弃所述礼物消息。
在获得礼物消息的等级信息后,根据该等级信息判断礼物消息的等级是否大于预设等级,例如,本申请实施例中,该预设等级可以为5级,3级等,具体此处不做限定。
具体的,根据礼物消息的等级信息对礼物消息的等级进行判断,如果礼物消息的等级大于预设级别例如5级则说明是一个高等级的礼物消息,而对于高等级礼物消息不需要进行降级,则可以直接给应用层展示,如果低层级则需要进行降级,例如通过if函数If(level>5){return true;},如果level大于5,则返回true,反之,则返回false。
另外,还需要依据消息giftype类型来存储消息的连击数目。
首先定义一个迭代器stl::map<int,int>::iterator itr;然后对迭代器进行初始化,Itr=gifTypeTimes.find(giftype);其次调用查找方法来查找此消息类型,然后对此消息类型进行加1表示又收到了一条此消息,Itr.second++,从而实现了消息类型连击数目的增加。
在底层收到礼物消息后,需要将当前连击数目推送给应用层。因此需要增加一个接口来获取对应消息的连击数目。在底层收到礼物消息后,需要将当前连击数目推送给应用层。因此需要增加一个GetGiftypeNum接口来获取所有消息的连击数目:
int GetGiftypeNum(int giftype){
首先定义一个迭代器itr:
stl::map<int,int>::iterator itr;
然后通过map容器的find方法来查找对应的消息类型。
itr=gifTypeTimes.find(giftype);
如果没有查找到则返回连击数目为0:
if(itr==gifTypeTimes.end()){
return 0;
}
如果查找到则返回连击数目:
else{
return itr.second;
}
}。
因此,客户端获得该礼物消息的连击次数后,存储该礼物消息的连击次数,并丢弃该礼物消息。
本申请实施例中,对于高等级的礼物优先进行展示,而不是直接丢弃掉,即需要优先丢弃低等级的礼物消息。同时对于低等级的礼物消息,由于其存在一个礼物的连击数目,如果直接丢弃会导致连击数目丢弃掉,因此在礼物消息降级时,实现了不展示丢弃的礼物消息,同时又保留该丢弃的礼物消息的连击数目的目的。
需要说明的是,本申请实施例中,还提供了多种降级方式以应用于各不同的应用场景,包括以下:
一、对弹幕消息进行降级。
可以理解的是,直播间中不仅有礼物消息还有弹幕消息,实际应用中,还存在对弹幕消息的降级。具体对弹幕消息的降级处理可以包括如下步骤:
1、从服务器获取客户端每秒钟显示弹幕的弹幕阈值。
该步骤与图1所示的实施例中的步骤102中描述的获取第一阈值的方式类似,此处不再赘述。
2、定义弹幕消息降级类;
为了更好的设计和编码,本申请实施例中,采用C++编程语言,来将整个消息降级的功能封装到一个C++的类中,从而可以提供成一个通用的功能,实现更好的代码复用和逻辑的封装。具体地,客户端定义一个弹幕消息降级类,该弹幕消息降级类用于对接收到的弹幕消息进行降级处理,本申请实施例中该弹幕消息降级类的类名为MessageLimit类,实现函数如Class MessageLimit{。
另外,本申请实施例中,客户端还会设计一个时刻队列来存储收到弹幕消息的时刻,实际应用中可以选取STL容器的list容器作为该时刻队列的数据结构,以实现高效的存入和删除,具体函数实现如下:
std::list<uint64_t>m_item_times;
需要说明的是,本申请实施例中,时刻队列存储的是收到弹幕消息的时刻,所以其存储的是一个时间的整数值,该时刻的类型是uint64_t。另外,为存储服务器下发的DanmuLimit阈值,客户端还需要定义一个存储阈值的成员变量size_t m_nLimit,即m_nLimit=DanmuLimit。
3、确定时刻队列中存储的时刻数量是否超过弹幕阈值;
需要说明的是,客户端还需设计弹幕消息降级类的接口信息,函数表现为boolCheck();此接口Check用于收到弹幕消息后,确定当前是否弹幕消息达到了阈值,如果没有则返回值为true,说明可以进行展示弹幕;如果达到了阈值,则返回值是false,说明不能存储弹幕消息了。
首先我们调用系统函数nowtime获取当前时刻并存储到now变量中,具体函数表示可以如下:
bool Check(){
uint64_t now=(uint64_t)nowtime();
通过调用if函数,如果小于m_nLimit则说明没有达到最大阈值,还可以存储当前时刻,那再调用list的push_back来存储当前时刻now到队列中。并且返回true;说明当前可以展示该条弹幕内容,具体函数表示可以如下:
if(m_item_times.size()<m_nLimit){
m_item_times.push_back(now);};
需要说明的是,客户端还需要判断当前时刻和队列最开头的时刻是否小于1的阈值,如果超过则返回false,即if((now-m_item_times.front())<=1000)urn false;},则返回false,其中1000表示1000毫秒也即是1秒。
4、在时刻队列中确定目标弹幕消息;
当客户端接收到弹幕消息后,若客户端确定时刻队列中存储的时刻数量超过弹幕阈值,则去检查时刻队列中是否存在接收时刻与当前时刻的时间差大于预定时长如1秒钟的弹幕消息,若存在,则该接收时刻对应的弹幕消息为目标弹幕消息。
5、删除目标弹幕消息。
客户端在时刻队列中确定目标弹幕消息后,接下来设计从时刻队列中删除掉所有的超过预定时长如1秒钟阈值的时刻。本申请实施例中,通过删除接口DeleteOlderTime删除该目标弹幕消息,此删除接口则会从时刻队列开头获取每一个时刻值与参数time即当前时刻来进行比较,看看其是否大于1秒钟,如果大于则删除掉该时刻值,否则不做任何操作。具体函数表现为:void DeleteOlderTime(uint64_t_time)。
需要说明的是,通过删除接口DeleteOlderTime删除目标弹幕消息,接下来则需要去实现此删除接口,以将时刻队列中所有时刻超过了1秒钟的时刻值删除掉。具体的,通过编写循环来遍历时刻队列。首先定义一个迭代器std::list<uint64_t>::iterator iter;然后对迭代器进行赋值为队列的起始iter=m_item_times.begin();接下来编写for循环来遍历,通过if函数判断时刻队列中的时刻与当前时刻的差值是否大于阈值1000毫秒,如果是则将其从时刻队列中删除掉,否则队列开头的时刻小于阈值则中断循环,直接返回。具体函数实现如下:
for(iter!=m_item_times.end();){
if((time-(*iter))>1000)
iter=m_item_times.erase(iter);
},其中,iter!=m_item_times.end()表示遍历的时刻是否是队列结尾。
二、基于客户端当前CPU和内存的使用率来设置滑动窗口的弹幕消息和礼物消息降级方法。
现有技术中,所有弹幕或者礼物降级的方法都是对所有设备所有时刻都是使用相同的阈值,并没有依据实际情况来对消息进行降级。例如对于iphoneX来说设置阈值为每秒100条弹幕消息,则阈值过于小了,因iphoneX性能完全可以胜任200条;而对于iphone4则可能只能承受50条弹幕。同样的,对于Android的设备也存在这样一种情况。因此,如果依据用户的设备来设置阈值,那么由于市面上设备种类非常之多,必须收集全所有的设备,而且对于iphone设备来说,即使是同一个设备,其所安装的系统版本,其性能也是不一样的。另外,对于同一个设备来说,即使系统相同,其当前接收弹幕的阈值也并不能设置的一样,因此对于用户使用设备来说,依据其当前的CPU使用率和内存使用率才是能够满足用户的实际情况。因此,本申请实施例中,可以依据用户当前实际的CPU使用情况和内存使用情况来动态的调整阈值,从而依据CPU和内存情况比较能真实的反映出用户的设备使用情况,同时也不需要去收集所有的设备类型。具体的实现方法如下所示:
1、编写功能获取当前的内存。
首先定义一个Android系统下的系统类Runtime对象Runtime runtime;然后调用系统函数来对对象进行赋值,具体函数实现如:runtime=Runtime.getRuntime();其中,对于Runtime类可以通过一些接口获取到当前内存的使用情况和总的内存。具体地,通过接口maxMemory来获取总的系统内存大小totalSize,long totalSize=runtime.maxMemory()>>10;然后获取系统当前没有被使用的内存大小long freesize=runtime.freeMemory()。获得了总的内存大小和空闲内存大小后,可以得到当前使用了多少内存以及内存使用率,具体地,Long usageSize=(runtime.totalMemory()-runtime.freeMemory())>>10;通过该函数得到了当前使用的内存,因此内存的使用率可以通过公式LongmemoryUsageRate=usageSize*100/totalSize获取,其中memoryUsageRate用于表示内存使用率。
2、编写功能获取当前的CPU使用情况。
对于系统CPU的使用情况,可以通过执行系统的命令来从命令返回的结果中获取到对应的数据。首先定义一个Android系统下的系统类Runtime对象Runtime runtime;然后调用系统函数来对对象进行赋值,具体函数实现如下:runtime=Runtime.getRuntime();然后调用其执行命令的接口来获取系统情况,Process p=runtime exec("top-n 1"),并将结果赋值给变量p。接下来再定义一个读取结果的对象,具体函数实现包括:BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream())),则实现了从中得到CPU的其他数据。并根据string函数分别获取用户使用的CPU和系统使用的CPU,具体的,通过函数String[]CPUusage=CPUusr[0].split("User")得到用户使用的CPU,用CPUusage表示,通过函数String[]SYSusage=CPUusr[1].split("System")得到系统使用的CPU,用SYSusage表示。在得到系统使用的CPU和用户使用的CPU后,就可以得到总的CPU使用情况,即CPUusage+SYSusage。
3、设置定时器定期采用得到1分钟内的内存和CPU使用情况。
需要说明的是,每次获取的使用情况是当前时刻的,为了更为平稳和准确,则需要进行采用一段时间内的使用情况,从而比较准确的反映当前的真实情况。因此本申请实施例中,可以设置一个定时器来在一分钟内定期的进行采样,通过采样来得到最终的CPU使用情况和内存使用情况。其中则可以调用系统函数SetTimer,来设置定时器每隔5秒钟调用一次Check函数,例如SetTimer(Check(),5)。通过Check函数获取到内存使用情况和CPU使用情况,并将5次获取的结果进行平均得到最终的结果。
4、依据平均结果来设置弹幕的和礼物的阈值。
客户端获取到了客户端的CPU和内存的使用情况后,并将数据上报到服务器,服务器则可以依据上报的数据,来下发对应的每秒钟客户端展示的弹幕阈值和礼物阈值,并且服务器可以依据使用情况来动态调整阈值,从而可以最终得到一个比较合理的阈值。
5、客户端依据服务器下发的阈值来降级礼物消息和弹幕消息。
客户端获取到了服务器下发的阈值后,则依据阈值来对消息和礼物进行降级,从而是依据每个客户端当前的内存使用情况和CPU使用情况来进行的降级,而并不是所有客户端都使用同一套值,因此定制化的降级更能依据用户设备的实际情况来降级,效果更好。
三、基于滑动窗口的弹幕延迟方案。
本实施例的设计初衷是对于一些移动设备进行弹幕降级,从而防止用户观看时产生卡顿现象。在之前的实施例中是对弹幕进行丢弃从而减少同一时刻客户端弹幕量的展示,以提高客户端的性能。而在有些情况下是客户端接收弹幕时,可能会存在一会有很多弹幕,一会弹幕量又比较少。而客户端如果在弹幕量很多的情况下,将超过阈值数量的弹幕直接丢弃掉,那么对于一些弹幕用户则观看不到,从而容易让用户误认为是弹幕服务器存在问题,同时一会弹幕多,过一会弹幕少的时候又没有弹幕可以进行显示。基于此本实施例则设计了一个新的方案,即满足在同一时刻不会同时展示大量弹幕,同时又不会丢弃掉弹幕,并且在后续弹幕量少时还可以展示之前的弹幕内容。本实施例的思路则是对收到的所有弹幕都放入到弹幕队列中。而推送给应用层的展示时则控制每一秒种的推送数量,而弹幕多时也推送一定数量,从而剩余的弹幕则会在后续弹幕量少的时候进行展示。具体的设计步骤如下所示:
1、从服务器获取客户端每秒钟显示弹幕的阈值。
该步骤与图1所示的实施例中的步骤102中描述的获取弹幕阈值的方式类似,此处不再赘述。
2、客户端封装一个弹幕消息存储的类。
为了更好的设计和编码,本实施例中,采用C++编程语言,来将整个消息降级的功能封装到一个C++的类中,从而可以提供成一个通用的功能。实现更好的代码复用和逻辑的封装。具体实现如下:
定义一个类名为MessageQueue类:Class MessageQueue{
本实施例中会设计一个队列来存储收到弹幕消息。为了高效的存入和删除,则选取STL容器的list容器做为队列的数据结构,例如std::list<string>m_item_times;另外,由于存储的弹幕消息是一条字符串,所以其存储的是一个string对象,因此类型是string。
接着对于弹幕消息队列为了防止多线程操作,造成队列数据污染,所以需要加入锁来进行多线程的同步互斥。那么定义一个Mutex write_mutex;互斥变量,同时后续需要编写网队列中存储弹幕消息的接口和从队列中取出弹幕消息的接口。
3、客户端编写弹幕消息队列类的存入接口。
在编写了一个弹幕消息队列后,消息队列需要编写存入弹幕消息的接口。并且对于消息队列可能存在多个线程对其进行操作,因此也需要编写线程安全的接口函数,具体如下:
Void WriteDanmuMessage(string strDanmu){
首先则定义一个自动锁对象ScopedLock lock,然后其传入本实施例定义的互斥变量write_mutex,并且该锁在函数执行完成时则会自动进行释放:ScopedLock lock(write_mutex);
然后调用list的接口push_back来将任务存入到队列的尾端:lst_buffer.push_back(strDanmu);}。
4、客户端编写弹幕消息降级类的删除接口。
另外,在编写了一个弹幕消息队列后,则弹幕消息队列需要编写取出弹幕消息的接口,并且对于消息队列可能存在多个线程对其进行操作,所以也需要编写线程安全的接口函数,具体函数实现如下:
string ReadDanmuMessage(){
首先则定义一个自动锁对象ScopedLock lock,然后其传入本文定义的互斥变量write_mutex。并且其锁在函数执行完成时则会自动进行释放:ScopedLock lock(write_mutex);
然后从队列中取出队列头部的一个弹幕消息strDanmu:string strDanmu=lst_buffer.front();接着则调用接口pop_front将队列头部的弹幕消息删除掉:lst_buffer.pop_front();然后返回取出的弹幕消息:Return strDanmu;}。
5、客户端创建控制弹幕每秒钟显示的数量。
本实施例中,客户端会控制每秒钟显示的弹幕数量,并且会将收到的所有弹幕存储到弹幕消息队列中,如果当前弹幕量比较大时则只显示部分弹幕,超过数量的弹幕则在后面进行显示。本实施例中则编写一个弹幕控制类来控制弹幕的数量,具体实现如下:
客户端定义一个类名为MessageLimit类,例如,Class DanmuLimit{;同时,客户端设计一个队列来存储收到弹幕消息的时刻。为了高效的存入和删除本实施例则选取STL容器的list容器做为队列的数据结构,例如std::list<uint64_t>m_item_times;可以理解的是,由于存储的是收到弹幕消息的时刻,因此存储的是一个时间的整数值,类型可以是uint64_t。
需要说明的是,本实施例还会涉及另一个时间队列,具体函数可以表示为:std::list<uint64_t>m_item_times2;当第一个队列存储的时间个数超过阈值时,此时则存入不了那么多弹幕消息,此时多余的则存储到第二个队列中。并且当第一个队列数量少于阈值时,会自动将第二个队列的数据补充到第一个队列中,从而展示剩余的弹幕。
另外,还需要定义一个存储阈值的成员变量size_t m_nLimit,其用来存储服务器下发的DanmuLimit阈值,即m_nLimit=DanmuLimit;
6、客户端设计弹幕消息降级类的接口信息。
需要说明的是,客户端还需设计弹幕消息降级类的接口信息,函数表现为boolCheck();此接口Check用于收到弹幕消息后,确定当前是否弹幕消息达到了阈值,如果没有则返回值为true,说明可以进行展示弹幕;如果达到了阈值,则返回值是false,说明不能存储弹幕消息了。
首先我们调用系统函数nowtime获取当前时刻并存储到now变量中,具体函数表示可以如下:
bool Check(){
uint64_t now=(uint64_t)nowtime();
通过调用if函数,如果小于m_nLimit则说明没有达到最大阈值,还可以存储当前时刻,那再调用list的push_back来存储当前时刻now到第一个队列中。并且返回true;说明当前可以展示该条弹幕内容,具体函数表示可以如下:
if(m_item_times.size()<m_nLimit){
m_item_times.push_back(now);};
需要说明的是,客户端还需要判断当前时刻和第一个队列最开头的时刻是否小于1的阈值,如果超过则返回false,即if((now-m_item_times.front())<=1000)urnfalse;},则返回false,其中1000表示1000毫秒也即是1秒。而当返回值是false时,需要将其存储到第二个队列中,具体函数实现如下:m_item_times2.push_back(now)。
7、客户端从队列中删除掉所有的超过1秒钟阈值的时刻。
需要说明的是,通过删除接口DeleteOlderTime删除超过1秒钟阈值的时刻对应的弹幕消息,接下来则需要去实现此删除接口,以将第一个队列中所有时刻超过了1秒钟的时刻值删除掉。具体的,通过编写循环来遍历第一个队列。首先定义一个迭代器std::list<uint64_t>::iterator iter;然后对迭代器进行赋值为队列的起始iter=m_item_times.begin();接下来编写for循环来遍历,通过if函数判断时刻队列中的时刻与当前时刻的差值是否大于阈值1000毫秒即1秒,如果是则将其从第一个队列中删除掉,否则第一个队列开头的时刻小于阈值则中断循环,直接返回。具体函数实现如下:
for(iter!=m_item_times.end();){
if((time-(*iter))>1000)
iter=m_item_times.erase(iter);
},其中,iter!=m_item_times.end()表示遍历的时刻是否是队列结尾。
当进行删除完成后,需要判断第一个队列中的数目,如果小于阈值,则需要从第二个队列中补充弹幕数据到第一个队列中,从而保障多余的弹幕可以进行显示不会丢弃掉。
对于控制类返回结果是可以显示弹幕时,则会将弹幕消息队列中的弹幕推送到应用层进行展示,同时对于推送过的弹幕并将其从弹幕消息队列中删除掉。
上面从礼物消息的降级方法的角度对本发明实施例进行了描述,下面从降级装置的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的降级装置的实施例示意图,其中,该降级装置具体包括:
收发单元201,由于通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;
存储单元202,当接收到消息时,用于将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;
判断单元203,用于判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;
解析单元204,若超过,则用于解析所述时刻队列中的各时刻对应的消息是否为礼物消息;
所述判断单元203,若所述时刻队列中的各时刻对应的消息中存在礼物消息时,还用于获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;
丢弃单元205,若不大于,则用于存储所述礼物消息的连击次数,并丢弃所述礼物消息。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;当接收到消息时,将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;若超过,则解析所述时刻队列中的各时刻对应的消息是否为礼物消息;若所述时刻队列中的各时刻对应的消息中存在礼物消息时,获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;若不大于,则存储所述礼物消息的连击次数,并丢弃所述礼物消息。
可选的,在一种可能的实施例中,所述处理器320还用于:定义消息降级类MessageLimit,所述消息降级类MessageLimit用于对接收到的消息进行降级处理;创建消息解析类SttDecoder,所述消息解析类用于解析所述时刻队列中的各时刻对应的消息是否为礼物消息。
可选的,在一种可能的实施例中,所述处理器320具体用于:定义http对象httpobjhttp;在所述http对象中填入所述直播间的域名信息和所述直播间的房间号信息;通过所述get函数objhttp.get()将所述直播间请求信息发送给所述服务器。
可选的,在一种可能的实施例中,所述处理器320具体用于:通过Parse函数pDecoder->Parse(NetMessage)解析所述时刻队列中的各时刻对应的消息,所述NetMessage用于表示消息为网络消息;通过string函数std::string cmdtype=std::string(pDecoder->GetItem(“type”))获取所述时刻队列中的各时刻对应的消息的类型,所述type用于表示消息的类型。
可选的,在一种可能的实施例中,所述处理器320还用于:根据所述礼物消息的礼物类型获取所述礼物消息的连击次数。
可选的,在一种可能的实施例中,所述处理器320具体用于:定义迭代器stl::map<int,int>::iterator itr;初始化所述迭代器itr;调用map容器的find函数itr=gifTypeTimes.find(giftype)查找所述礼物消息的礼物类型;若找到所述礼物类型,则所述find函数返回所述礼物消息的连击次数。
由于本实施例所介绍的电子设备为实施本发明实施例中一种获取装置所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;当接收到消息时,将接收到所述消息的时刻存储到时刻队列中,所述时刻队列用于存储接收消息的时刻;判断所述时刻队列中存储的时刻数量是否超过所述第一阈值;若超过,则解析所述时刻队列中的各时刻对应的消息是否为礼物消息;若所述时刻队列中的各时刻对应的消息中存在礼物消息时,获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;若不大于,则存储所述礼物消息的连击次数,并丢弃所述礼物消息。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:定义消息降级类MessageLimit,所述消息降级类MessageLimit用于对接收到的消息进行降级处理;创建消息解析类SttDecoder,所述消息解析类用于解析所述时刻队列中的各时刻对应的消息是否为礼物消息。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:定义http对象http objhttp;在所述http对象中填入所述直播间的域名信息和所述直播间的房间号信息;通过所述get函数objhttp.get()将所述直播间请求信息发送给所述服务器。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过Parse函数pDecoder->Parse(NetMessage)解析所述时刻队列中的各时刻对应的消息,所述NetMessage用于表示消息为网络消息;通过string函数std::stringcmdtype=std::string(pDecoder->GetItem(“type”))获取所述时刻队列中的各时刻对应的消息的类型,所述type用于表示消息的类型。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:根据所述礼物消息的礼物类型获取所述礼物消息的连击次数。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:定义迭代器stl::map<int,int>::iterator itr;初始化所述迭代器itr;调用map容器的find函数itr=gifTypeTimes.find(giftype)查找所述礼物消息的礼物类型;若找到所述礼物类型,则所述find函数返回所述礼物消息的连击次数。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。

Claims (8)

1.一种礼物消息的降级方法,其特征在于,包括:
通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;
接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;
当接收到消息时,将接收到所述消息的时刻存储到第一时刻队列中,所述第一时刻队列用于存储接收消息的时刻;
判断所述第一时刻队列中存储的时刻数量是否超过所述第一阈值,且判断当前时刻与所述第一时刻队列最开头的时刻的差值是否小于预定时差;
若所述第一时刻队列中存储的时刻数量超过所述第一阈值,且所述当前时刻与所述第一时刻队列最开头的时刻的差值小于预定时差,则解析所述第一时刻队列中的各时刻对应的消息是否为礼物消息;
若所述第一时刻队列中的各时刻对应的消息中存在礼物消息时,则获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;
若不大于,则存储所述礼物消息的连击次数,并丢弃所述礼物消息;
定义消息降级类MessageLimit,所述消息降级类MessageLimit用于对接收到的消息进行降级处理;
创建消息解析类SttDecoder,所述消息解析类用于解析所述第一时刻队列中的各时刻对应的消息是否为礼物消息;
其中,当第一时刻队列存储的时刻数量超过所述第一阈值时,将多余的时刻存储到第二时刻队列中,并当所述第一时刻队列中时刻数量少于所述第一阈值时,自动将所述第二时刻队列中的数据补入到所述第一时刻队列中;
所述第一阈值根据客户端的CPU和内侧使用情况进行动态调整。
2.根据权利要求1所述的方法,其特征在于,所述通过调用http的get函数向服务器发送直播间请求信息包括:
定义http对象http objhttp;
在所述http对象中填入所述直播间的域名信息和所述直播间的房间号信息;
通过所述get函数objhttp.get()将所述直播间请求信息发送给所述服务器。
3.根据权利要求1所述的方法,其特征在于,所述解析所述第一时刻队列中的各时刻对应的消息是否为礼物消息包括:
通过Parse函数pDecoder->Parse(NetMessage)解析所述第一时刻队列中的各时刻对应的消息,所述NetMessage用于表示消息为网络消息;
通过string函数std::string cmdtype=std::string(pDecoder->GetItem(“type”))获取所述第一时刻队列中的各时刻对应的消息的类型,所述type用于表示消息的类型。
4.根据权利要求3所述的方法,其特征在于,所述存储所述礼物消息的连击次数之前,所述方法还包括:
根据所述礼物消息的礼物类型获取所述礼物消息的连击次数。
5.根据权利要求4所述的方法,其特征在于,所述根据所述礼物消息的礼物类型获取所述礼物消息的连击次数包括:
定义迭代器stl::map<int,int>::iterator itr;
初始化所述迭代器itr;
调用map容器的find函数itr=gifTypeTimes.find(giftype)查找所述礼物消息的礼物类型;
若找到所述礼物类型,则所述find函数返回所述礼物消息的连击次数。
6.根据权利要求4所述的方法,其特征在于,所述存储所述礼物消息的连击次数包括:
通过stl容器的map容器stl::map<int1,int2>gifTypeTimes关联所述礼物消息与所述礼物消息的连击次数,所述int1用于存储所述礼物消息的礼物类型,所述int2用于存储所述礼物消息的连击次数。
7.一种降级装置,其特征在于,包括:
收发单元,由于通过调用http的get函数向服务器发送直播间请求信息,所述直播间请求信息用于请求直播间信息,所述直播间请求信息包括所述直播间的域名信息和所述直播间的房间号信息;接收所述服务器返回的所述直播间信息,所述直播间信息包括第一阈值,所述第一阈值用于指示预定时长内接收消息的最大数值,所述第一阈值存储于定义的变量size_t m_nLimit中;
存储单元,当接收到消息时,用于将接收到所述消息的时刻存储到第一时刻队列中,所述第一时刻队列用于存储接收消息的时刻;
判断单元,用于判断所述第一时刻队列中存储的时刻数量是否超过所述第一阈值,且判断当前时刻与所述第一时刻队列最开头的时刻的差值是否小于预定时差;
解析单元,若所述第一时刻队列中存储的时刻数量超过所述第一阈值,且所述当前时刻与所述第一时刻队列最开头的时刻的差值小于预定时差,则用于解析所述第一时刻队列中的各时刻对应的消息是否为礼物消息;
所述判断单元,若所述第一时刻队列中的各时刻对应的消息中存在礼物消息时,还用于获取所述礼物消息的等级信息,并根据所述礼物消息的等级信息判断所述礼物消息的等级是否大于预设等级;
丢弃单元,若不大于,则用于存储所述礼物消息的连击次数,并丢弃所述礼物消息;
处理器,用于定义消息降级类MessageLimit,所述消息降级类MessageLimit用于对接收到的消息进行降级处理;创建消息解析类SttDecoder,所述消息解析类用于解析所述第一时刻队列中的各时刻对应的消息是否为礼物消息;
其中,当第一时刻队列存储的时刻数量超过所述第一阈值时,将多余的时刻存储到第二时刻队列中,并当所述第一时刻队列中时刻数量少于所述第一阈值时,自动将所述第二时刻队列中的数据补入到所述第一时刻队列中;
所述第一阈值根据客户端的CPU和内侧使用情况进行动态调整。
8.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-6任意一项所述的方法。
CN201811161526.2A 2018-09-30 2018-09-30 一种礼物消息的降级方法及相关装置 Active CN110971921B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811161526.2A CN110971921B (zh) 2018-09-30 2018-09-30 一种礼物消息的降级方法及相关装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811161526.2A CN110971921B (zh) 2018-09-30 2018-09-30 一种礼物消息的降级方法及相关装置

Publications (2)

Publication Number Publication Date
CN110971921A CN110971921A (zh) 2020-04-07
CN110971921B true CN110971921B (zh) 2022-03-25

Family

ID=70029249

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811161526.2A Active CN110971921B (zh) 2018-09-30 2018-09-30 一种礼物消息的降级方法及相关装置

Country Status (1)

Country Link
CN (1) CN110971921B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107302489A (zh) * 2017-06-02 2017-10-27 北京潘达互娱科技有限公司 消息展示方法及装置
CN107423128A (zh) * 2017-07-31 2017-12-01 北京京东尚科信息技术有限公司 信息处理方法及其系统
CN108174305A (zh) * 2016-12-07 2018-06-15 北京云中融信网络科技有限公司 直播聊天室的消息处理方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108174305A (zh) * 2016-12-07 2018-06-15 北京云中融信网络科技有限公司 直播聊天室的消息处理方法及装置
CN107302489A (zh) * 2017-06-02 2017-10-27 北京潘达互娱科技有限公司 消息展示方法及装置
CN107423128A (zh) * 2017-07-31 2017-12-01 北京京东尚科信息技术有限公司 信息处理方法及其系统

Also Published As

Publication number Publication date
CN110971921A (zh) 2020-04-07

Similar Documents

Publication Publication Date Title
CN110968279B (zh) 一种消息的降级方法及相关装置
CN102932679B (zh) 一种网络视频预览系统和方法
US9912974B2 (en) Shot structure of online video as a predictor of success
WO2017005149A1 (zh) 一种游戏加速方法和装置
US20110307623A1 (en) Smooth streaming client component
CN105100748B (zh) 一种视频监控系统及方法
CN104850318B (zh) 瞬时消息显示控制的方法及设备
CN110971920B (zh) 一种消息的降级方法及相关装置
CN109120954B (zh) 视频消息推送方法、装置、计算机设备及存储介质
CN111064954A (zh) 一种可供旁路视频播放质量评价使用的方法和装置
US20200137347A1 (en) Detection of photosensitive triggers in video content
CN111277910A (zh) 弹幕显示方法、装置、电子设备及存储介质
CN109587511A (zh) 多设备视频直播方法、设备、系统及存储介质
CN112799925A (zh) 数据采集方法、装置、电子设备和可读存储介质
CN113318440A (zh) 弹幕生成方法及装置、存储介质、电子设备
CN110971919B (zh) 一种弹幕消息的降级方法及相关装置
CN107872714B (zh) 一种弹幕的处理方法、终端设备以及计算机可读存储介质
WO2019047663A1 (zh) 一种基于视频格式的端到端自动驾驶数据的存储方法及装置
EP2997715B1 (en) Transmitting information based on reading speed
AU2018275194A1 (en) Temporal placement of a rebuffering event
CN108063746B (zh) 数据的处理方法、客户端、服务器及系统
CN110971921B (zh) 一种礼物消息的降级方法及相关装置
CN108965345A (zh) 一种小信令网络数据包的优化方法及装置
CN112565886A (zh) 一种视频抽帧方法、装置、电子设备及可读存储介质
CN109213534A (zh) 一种扩展直播软件功能的方法及装置

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
GR01 Patent grant
GR01 Patent grant