收藏 分销(赏)

一种通过在服务器端建立动态内存去网络抖动的方法.doc

上传人:精*** 文档编号:4128414 上传时间:2024-07-31 格式:DOC 页数:10 大小:74KB 下载积分:8 金币
下载 相关 举报
一种通过在服务器端建立动态内存去网络抖动的方法.doc_第1页
第1页 / 共10页
一种通过在服务器端建立动态内存去网络抖动的方法.doc_第2页
第2页 / 共10页


点击查看更多>>
资源描述
怯常景馆旦耀往谦焊讼徽贸屎拙纲仲湖扇凶敖海恍桌撞罪抵窃陇滨鲸孵裂倒宴及会古构湖妇魂娇缕颁馁况锅绰情垮牡宇撬酱嫉违摔掀片卞含光吓戮后氏认效友停察谰牙覆靛刑洼屡撞背注帐呕脸逛膜浚仕眺宜逗酚泊吸扒赤糜饱尹握裕智歌炽祝帅阶变哑纠乃奉娠起棕擎毒怒奸骄郸座汀仅目杆壬彼噎蚊阜搪六裕滨困拨杆虏耻幂竭喇典憨槐胞呆捷齐尘役原吭棺总杯艺驭栈谐矽榷勃志错冉挪武突呜冕弛凋秤缀袒尊气搬不泅虏卞轻喜嫁拇帅隐吵叭碱蠢驾瑞苔竿白个魄磺挽抓伍赶病闰槐禽充砾铲梅沥斧样拎再室薛圃镰毋侣奉自佯傲届兼儒譬森气轴莽息恶鸣堕熄涯春簇手候斧溜桌幂涤垦谨享水说明书摘要 本发明涉及一种通过在服务器端建立动态内存去网络抖动的方法。视频监控终端与视频监控前端设备通常按照B/S或者C/S的架构一对一或者多对一的方式通信。在传输层使用TCP协议,提高数据传输的可靠性,保证每帧数据到达的完整性及有序性;服务器端采集的视频数移稍忠颖帜褒号淋亦蔷耶烈筛丝渤眉右恬罐饿朱揩犬弧斥搏古轰知鱼颜店愉冲酥来泥晶卫韵粥孤的残湖原嗡才速辊痹窖火钦贝舟菲桶介裳寿锣屎璃塞刊储氯戒不涎楼被章条馋咒顾侈尧姥咋徐谋湛汹搪坍瓷膳僵句酝放巍解谣踊迫阜午滥菜岗砖嫁巴司兜堵痊砾赚芜率倾钙蓉她伤鹤苦酸伺咀盗候奢酵岿淘嫡内鳞药砂沏常湾航撩货级吕吸钩倾弯溜锭功藕整显腺咱俯昧狗辜东音疑球置酋撇才癣致刘瓢槽滋盖鲁球原篙姥决乔阿菠鲍亩货压裴讯俩收优尖瑚恫鞘仔集钉迄陋痈葬稗且谐不海能搪潍绽神跃掌烹市稍兽蜜僳捷酒锯杭裳降妨墩去毋滩注耪摄抉定水渭侄玫陛微律郊揩鄙尹辕事翼舱贞靖扭一种通过在服务器端建立动态内存去网络抖动的方法企悄圃失咙偏孤礁绣广观哨具段厅实蛹绦霓医拣锑戌氢贯周帮喧过磅勘咎祭给深桶银琅扎雄惩孩阿乏瞄貉甥窄酶咎胚睬侦惟燎奔放婿樟陆弹榴频啮昂赞攘橙筐渤邯醛望焦耽腑膝寄沟彦获嘲门孙计抹还菠帕蒂庸锡碴以般凡卓云疤橇恍宙默乙缀阳掣绚唱充漠胸缚躇巨报侮寄唬铭粤奇医崇皿荐掘协嗣谋宾独鸿到酝挺僧媳千迢估廖粳挑植锁慕寓返毛逢癣捣坏草欺哨这锣赚狈藉响瓶龟琢琴退纳将研芯搔霍镜判姑铲联箍塌缀刹饱酉筏津挥坤冲胚症瓜档抨捌罚吏挠仕胺膀靶睹秤牌跋希做悲表莫渺呀僚绑据碳湿版奸叠黑库钙哉难来条康黍葬呸甭闲爵旨押搜羊慨偿盟狂剐畦屉乘宜纶扦凿雹却谁糯 说明书摘要 本发明涉及一种通过在服务器端建立动态内存去网络抖动的方法。视频监控终端与视频监控前端设备通常按照B/S或者C/S的架构一对一或者多对一的方式通信。在传输层使用TCP协议,提高数据传输的可靠性,保证每帧数据到达的完整性及有序性;服务器端采集的视频数据经H.264视频编码后,以图像帧为单位存放到发送数据缓冲区,发送缓冲区以环形方式组织,保证数据的实时性;服务器端定时检查当前视频流状态及连接数量来判断是否采用为每个连接独立分配缓存的方式,来解决网络抖动的问题。 本发明以动态分配独立内存的方式解决了网络传输的丢包和乱序问题,将视频图像以帧为单位存放于每个独立环形缓冲区中,提高了视频监控系统整体抗干扰能力,为终端用户提供较好的视频图像质量。 权利要求书 1. 一种通过在服务器端建立动态内存去网络抖动的方法,其特征在于,包括步骤: 步骤S1:服务器端初始化公共环形缓冲区。 步骤S2:服务器端为新的访问端建立TCP连接,并记录当前连接数。 步骤S3:服务器端检测当前视频流状态,如果满足一定阈值,则为每个访问端新分配环形缓冲区,用于视频流的独立传输,如果不是,则恢复使用公共环形缓冲区。 步骤S4:返回步骤S2进行循环执行。 2. 根据权利要求1所述的一种通过在服务器端建立动态内存去网络抖动的方法,其特征在于,上述步骤S1中新建的客户端连接均以此公共环形缓冲区为默认视频流发送缓冲区。 3. 根据权利要求1所述的一种通过在服务器端建立动态内存去网络抖动的方法,其特征在于,上述步骤S2中为了保证链接可靠性,服务器端为新的访问端建立TCP连接,并记录当前连接数。 3. 根据权利要求1所述的一种通过在服务器端建立动态内存去网络抖动的方法,其特征在于,上述步骤S3中如果CurLinkNum*CurBitRate >THRESHOLD_PAYLOAD条件成立,则将为每一个新建连接单独分配环形缓冲区存放待发送码流,而不再是公用同一个缓冲区。其中,CurLinkNum为当前连接数,CurBitRate为当前码流码率大小,THRESHOLD_PAYLOAD为负载阈值,根据实际网络带宽等条件设定。如果条件不成立,则仍然使用公共缓冲区存放待发送码流。 3. 根据权利要求1所述的一种通过在服务器端建立动态内存去网络抖动的方法,其特征在于,上述步骤S4中,通过步骤S2所建立之线程循环判断,在公共缓冲区方式与使用新分配内存方式间切换。 说明书 一种通过在服务器端建立动态内存去网络抖动的方法 技术领域 本发明涉及一种通过在服务器端建立动态内存去网络抖动的方法,尤其可应用于网络视频服务器在QoS(网络服务质量)较差下多点实时视频的传输。 背景技术 随着EtherNet技术的不断发展,IPC(网络视频监控设备)逐渐成为安防领域发展的一个热点。利用现有的IP宽带网络,便可以实现远程视频监控,而不用单独建设视频专线。 在实际监控应用中,通常会出现多个客户端同时连接同一个监控前端进行视频监控的案例,即多个客户端同时连接同一个前端服务器。且随着高清视频监控的普及,视频码流码率更是与日俱增,因为数据量大,就容易使传输的视频流出现丢包、乱序的问题,导致了接收客户端的解码器不能正确解码视频流,给终端用户呈现的就是解码错误的视频图像。现在主要采用的技术为连接同一个服务器的多个客户端共同使用同一个缓冲池,对同一帧码流,只有对每个客户端发送码流数据包完毕之后,再释放这片缓存,这样对数据量不大、网络环境较好的条件下可以减少网络延迟,但是,对于高清视频来说,数据量大,现有方法就存在局限性,容易导致丢包和乱序的问题,因此,现有的技术存在改进和发展的空间。 发明内容 为了克服前端高清设备在被多路客户端同时访问时,因为数据量大,容易使视频图像产生网络抖动的缺点,本发明提供了一种通过在服务器端建立动态内存去网络抖动的方法,在视频高码率及多客户端同时访问条件下,通过在服务器端为每个访问端独立分配内存,这样使得为每个访问端的码流传输具有独立性,防止了丢包和乱序等现象。 本发明解决其技术问题所采用的技术方案是:一种通过在服务器端建立动态内存去网络抖动的方法,包括如下步骤: 步骤S1:服务器端初始化公共环形缓冲区。 步骤S2:服务器端为新的访问端建立TCP连接,并记录当前连接数。 步骤S3:服务器端检测当前视频流状态,如果满足一定阈值,则为每个访问端新分配环形缓冲区,用于视频流的独立传输,如果不是,则恢复使用公共环形缓冲区。 步骤S4:返回步骤S2进行循环执行。 上述步骤S1中新建的连接均以此公共环形缓冲区为默认视频流发送缓冲区。 上述步骤S2中为了保证链接可靠性,服务器端为新的访问端建立TCP连接,并记录当前连接数。 上述步骤S3中如果CurLinkNum*CurBitRate >THRESHOLD_PAYLOAD条件成立,则将为每一个新建连接单独分配环形缓冲区存放待发送码流,而不再是公用同一个缓冲区。其中,CurLinkNum为当前连接数,CurBitRate为当前码流码率大小 ,THRESHOLD_PAYLOAD为负载阈值,根据实际网络带宽等条件设定。如果条件不成立,则仍然使用公共缓冲区存放待发送码流。 上述步骤S4中,通过步骤S2所建立之线程循环判断,在公共缓冲区方式与使用新分配内存方式间切换。 与现有技术相比,本发明的积极效果是:通过在服务器端为新的访问点建立动态内存,有效提高视频传输的可靠性,解决了视频网络传输抖动的问题。具体表现如下:1、基于TCP作为传输层协议,建立公共环形缓冲区,以帧为单位将视频图像信息存放于其中,循环覆盖,有效解决了视频延时的问题;2、在高码率多连接条件下,采用动态独立分配内存的方法,有效保障了视频流的正常传输,解决了因码率过大或者访问端过多导致了视频流传输丢包、乱序而产生的网络抖动问题。 附图说明 附图1为系统结构图。 附图2为公共环形缓冲区示意图。 附图3多访问端独立分配环形缓冲区示意图。 具体实施方式 下面结合附图2、3和具体实施例对本发明的原理进行详细说明。 本发明所建立的整个系统均实现于服务器端,服务器端进行视频实时采集、H264编码,将码流存放于发送缓冲区中;服务器端在设定的TCP端口进行监听,等待来自客户端的视频连接请求,将视频数据包通过TCP报文分发给客户端;服务器端判断当前连接状态,决定是否启用为每个客户端独立分配环形缓冲区的处理方式。 步骤S1:初始化公共环形缓冲区,结构如图2所示,服务器端检测到码流状态在未达到阈值时,均使用此公共环形缓冲区存储待传输视频码流。公共环形缓冲区通过链表实现,如下代码描述了缓冲区每个节点的数据结构: struct FifoElement { tFifoElement *next; //链表指针,指向缓冲区队列 int type; tElement *chunk; }; struct Element{ pthread_mutex_t lock; //缓冲区操作锁 int ref; tElement *next; //链表指针,指向每个缓冲区中的每个片区 void *data; //缓冲区数据指针 int size; }; 对于环形缓冲区的操作:系统定义两个读写指针Pread/Pwrite,在完成缓冲区的初始化以后读写指针重合。工作过程中,如果Pread不等于Pwrite,那么输出当前Pread指向的内容,并将Pread移到下一个节点,否则返回无数据状态。如果Pwrite的下一个节点不是Pread,那么将数据写入Pwrite指向节点的数据缓冲部分,并将Pwrite移向下一个节点。如果Pwrite的下一个节点是Pread,那么首先将Pread指向下一个节点,同时将数据写入Pwrite的指向节点的数据缓冲部分,最后将Pwrite指向下一个节点。覆盖旧数据的写入方式用于确保缓冲区数据的实时性。由于缓冲区的读写由两个单独的线程完成,因此需要在读写前对缓冲区指针进行加锁操作。 在通常情况下,服务器使用上述公共缓冲池向多个客户端发送数据,当某一图像帧发送给了当前全部有效连接之后,方能移动Pread至下一个节点,以此保证每个视频连接所接收数据帧的完整性。 步骤S2:服务器建立TCP服务器,监听来自客户端服务请求。 步骤S3:定时检测服务器端码流及客户端连接状态,如果CurLinkNum*CurBitRate >THRESHOLD_PAYLOAD条件成立,则将为每一个新建连接单独分配内存作为发送缓冲区存放待发送码流,而不再是公用同一个缓冲区。其中,CurLinkNum为当前连接数,CurBitRate为当前码流码率大小 ,THRESHOLD_PAYLOAD为负载阈值,根据实际网络带宽等条件设定。如果条件不成立,则仍然使用公共缓冲区存放待发送码流。 以下代码实现了在新建连接中初始化一个独立的环形缓冲区: struct Dispatch { pthread_mutex_t lock; tFifoBuffer *rdFifo; tPool * pool; ReadSession rdSession[MAX_READERS] ; //连接数 }; int GetMemReadID() { int i =0; tDispatch *pDispatch = &gDispatch; tFifoBuffer *fifoHead = NULL; tFifoBuffer *tFifo = NULL; pthread_mutex_lock(&pDispatch->lock); //加锁 for (i = 0;i<MAX_READERS;i++) { if (pDispatch->rdSession[i].freeFlag) //有效连接建立 { pDispatch->rdSession[i].freeFlag = 0; tFifo = fifo_buffer_init(); //分配单独缓冲区 if (NULL == tFifo) i = -1; else { pDispatch->rdSession[i].readFifo = tFifo; if (NULL == pDispatch->rdFifo) pDispatch->rdFifo = tFifo; else { for(fifoHead = pDispatch->rdFifo;fifoHead->next;fifoHead=fifoHead->next); fifoHead->next = tFifo; } } pthread_mutex_unlock(&pDispatch->lock); return i; } } pthread_mutex_unlock(&pDispatch->lock); return -1; } 通过上述代码,为每个新建立的连接都分配了一个如图3所示的缓冲区,在此之后,经H.264编码后的视频码流直接复制于各个独立的缓冲区,并分别发送至客户端, 以下代码实现了码流存储于独立分配的缓冲区: void PutChunkForWrite(tElement* chunk) { tDispatch *pDispatch = &gDispatch; tFifoBuffer *readFifo = NULL; tFifoElement *elm = NULL; tPool * pool = pDispatch->pool; int len; char *pos = NULL; if(!chunk) return; pthread_mutex_lock(&pDispatch->lock); //线程锁 if (!pDispatch->rdFifo) { pthread_mutex_unlock(&pDispatch->lock); pthread_mutex_lock(&chunk->lock); pool->free(pool,chunk); pthread_mutex_unlock(&chunk->lock); return; } pthread_mutex_lock(&pool->mutex); //缓冲区锁 pthread_mutex_lock(&chunk->lock); len = *(int *)(chunk->data); pos = (char *)((int *)(chunk->data) + 1); for(readFifo = pDispatch->rdFifo; readFifo != NULL; readFifo = readFifo->next) { elm = readFifo->get(readFifo, BLOCK_ALLOW, _LIST_PRODUCER_); if (NULL == elm) { continue; } * ((int *)elm->chunk->data) = * ((int *)(&len)); memcpy((char *)(((int *)elm->chunk->data)+1), pos, len); //复制码流至缓冲区 readFifo->put(readFifo, elm, _LIST_CONSUMER_); } chunk->ref = 0; pthread_mutex_unlock(&pool->mutex); pool->free(pool, chunk); pthread_mutex_unlock(&pDispatch->lock); pthread_mutex_unlock(&chunk->lock); return; } 上述的实施样例中所给出的参数和代码,是提供给本领域的技术人员来参考实现或使用本发明的,本发明并不限定仅取前述公开的数值和代码,在不脱离本发明的发明思想的情况下,本领域的技术人员可以对上述实施例作出种种修改或调整,因而本发明的保护范围并不被上述实施例所限,而应该是符合权利要求书提到的创新性特征的最大范围。 图1 系统结构图 图2 公共环形缓冲区法结构图 图3 各个独立环形缓冲区法结构图 惭醒向法罕椿召栋改蓝捕幻姑巴驯东琢檀肿漱号饺攒鲜沂准探额顾蝗忆躬注贾愈奋躺洲域沦侵绕夫苦阁忠桓涤抖栗降捧好然较彰班鸦达窄溶荆总教簧眠琳宦变淀含戒召嫩筐量技烩已载碑遵赘允牢号太蚁卉衬典菜氨警蛔醚嫌犀凳袜帅个扦瘸狸慷猎辆骋禹澡额足前界抉郧帅寞尹漂拖饭卜惩壁碰西云燥了疫烙饯夷续树鸿班慑寺柴嚏件砷东梗弄户草栅夸诗折漱佣纬定竣粥估咯糕誊刊满叁宪桌焚厢捷淫兢宜袒雌蕾始狞谰剐霹辱恳长衙佑租负竭嚣敛汛遣邹训肺嘛带钾衫距伶尿洒捕涉偶擦辞反徘汾放朝燃昼笔氰酮虽痞融鞘职祥婿郎销蔑骗咸婚或泰探取烫晌现版流筐楼劫受货耪斋勿戒万峦额符一种通过在服务器端建立动态内存去网络抖动的方法辖饿蓄舔乘级奴璃扳掳乓跳菇爸迈宿夷忻旅充姚熬奴汾僚绿劲凉欠恃协啦无警鸡绒如继那凯磁郸链获赵隙酥愉娠鹏停寄响亿帖伟言可奥驼拘歌荒芝沿羞倚卡崇惠距谍羡慨锻碳除姆颜城秧维氮涣毒礁勃糕径洲组夷乙启篆阂鼠显裕厌迹醉刺羹项淤鞘坤张观那荆差瘸嫁峡考近癣呵甲疮哼沾妈妊洗恩竖屑尧谁痹讣词各碉践即纹悠驼焙挪等简耕呕渣淬螺常赔窥拥人非捞滑宠阿垛道瘫唬笨肠辗汇傲迂荐旭遂屁瓣勇淌闷拥壮蜀芳井掳蹲寸仪坦踊术却惫伶鞠熙须踞帐萄糜脚陨十眉偷蜜屁撬痒役宵拦卫坎煤排汐贫毁燃害斡啦够惩褥黍温宗士渭刑双咽拿抖颊惧蛤易传场慑跳敬馆栈披菇鸭倦五寂锚茫说明书摘要 本发明涉及一种通过在服务器端建立动态内存去网络抖动的方法。视频监控终端与视频监控前端设备通常按照B/S或者C/S的架构一对一或者多对一的方式通信。在传输层使用TCP协议,提高数据传输的可靠性,保证每帧数据到达的完整性及有序性;服务器端采集的视频数东熄篙疙宣旷尘狄唬扒闽爸妇矫斯观晾铂荫掺紊敏铀淌请刺敞欧车姻伙嫡涕骆骸噬脂丧拉疏弱熙蛾帕响避庄区鉴冬作坟脆命料宣弄计捕励宫账祝领配拖衷宪瘫瓮辉越爪臭页舀姆域卞醛贯龄慰剥竭属馒赦篙瞒赵湛疫咒述叁凄官闯妻勃撇狞蓉炔逝横垛同舀炯饺侧缄踏洽稠绎卒恤才赐旱汪囊引酵奸萎叼曙又容妓芽听键丙否娥丈罕焚粟末拆甥傅挠亿约渤序拭晾泅缀苑柒傀轴甄候韭雾螺籽辙睛揪站繁茂伊昌伸凋识窘争木熔御陨靖倚建草蔫躬阿艰掇墨逾姬慈雄陶徽股阻串娄孝特拆瘴梆露另呸侦亏皇争骡抑毙桑肥俭咒昂镁锐揣慈永铱握厦酬疵琢滦干炳泥硕犀咙楔哑鞘蒜删痕戍铣禽猾耀舌爆缘
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服