一种基于ip网络的实时视频传输方法

文档序号:7715963阅读:226来源:国知局

专利名称::一种基于ip网络的实时视频传输方法
技术领域
:本发明涉及一种基于IP网络的视频传输技术,特别适用于QoS(服务质量)较差的网络环境,比如无线网络。
背景技术
:随着网络技术的发展,基于IP网络的视频监控逐渐成为安防领域发展的一个热点。利用现有的IP宽带网络,可以实现在现有IP网络上传输视频数据,而不用建设单独的视频线路。当前基于IP网络的视频传输在传输层主要使用UDP协议,应用层使用RTP协议,在网络服务质量(QoS)较好的情况能满足视频流的顺利传输。IP网络的服务质量主要包括延时、抖动、丢包、乱序四个方面。视频在传输前通常使用MPEG4/H.264等算法进行压縮,以减少传输时占用的网络带宽,在接收端进行解码并显示。在网络服务质量较差的情况下使用UDP/RTP协议来实现视频传输,接收端存在不能流畅播放视频的现象。具体表现在抖动较严重的情况下会产生图像停顿或者时快时慢的现象;在丢包较严重的场合下,接收端的解码器不能正确解码视频流从而正确显示图像;传输层使用UDP协议会产生乱序,从而需要在接收端通过RTP协议进行报文重排序,需要较大的缓冲区并产生延时;目前已存在如下的一些技术解决方法南京工业大学学报2004年11月(第26巻第6期)刊载《一种基于DirectShow的实时视频传输实现方法》一文介绍了使用directshow技术实现的基于IP网络的实时视频传输方法,但是在传输层选择使用UDP协议;在解决抖动方面也没有使用本专利提到的带覆盖的环形缓冲区技术;在客户端视频播放方面也没有采用基于反馈的时钟调节技术。类似的信息还包括核电子学与探测技术2007年1月(第27巻第1期)刊载《基于directshow的Mpeg4网络视频流处理系统》一文,在接收端处理方面使用了环形缓冲区技术,但是没有采用覆盖技术,在网络抖动较大的情况下会产生较大的显示延时。自动化技术与应用2008年第27巻第2期刊载《基于directshow的视频传输系统的设计》一文,但是没有使用和本专利相冲突的技术。因此,现有技术存在有待改进和发展的空间。
发明内容本发明的目的在于使用TCP作为传输层协议,并通过优化缓冲区结构和视频接收时钟的方式来提高实时视频的整体传输效果。本发明的技术方案包括—.发送端和接收端在传输层使用TCP协议,提高数据传输的可靠性;二.接收端以图像帧(包括控制帧)为单位存放到接收缓冲区中,接收缓冲区以环形方式组织,在处理较慢的情况下可以使用最新的帧覆盖最过时的帧,保持数据的实时性;三.以directshow/gstreamer等作为多媒体框架,根据显示端的时钟反馈实时调节接收端视频帧的时间戳。本发明使用TCP协议作为传输层协议,有效提高视频传输的可靠性,解决网络传输的丢包和乱序问题,避免解码器出现不能正常解码的现象;以帧为单位将图像信息存放在环形缓冲区中,有效解决了延时和抖动问题;在接收端使用多媒体框架,根据显示过滤器的时钟反馈,实时调整接收过滤器的输出视频帧时间戳,使视频达到顺畅播放的效果。图l整系统结构图;图2网络传输报文结构;图3接收端缓冲区结构图4接收端多媒体框架。具体实施例方式下面通过一个实施案例,进一步说明本发明。整个系统主要包括两个大的组成部分发送端和接收端(整系统结构见图1);发送端实现视频的实时采集,并使用MPEG4/H.264等压縮算法进行视频压縮。发送端拥有固定的公网IP地址,在某个固定的TCP端口进行监听,等待来自客户端的视频请求,将压縮后的视频数据包含到TCP报文的内容部分并发送给接收端(网络报文结构图见图2);如果发送端和接收端都没有固定的公网IP地址(比如通过NAT方式访问互联网),则需要具有公网地址的第三方服务器实现数据中转。接收端通过directshow/gstreamer等多媒体框架实现。在多媒体框架下,包含了用于实现视频接收、解码和显示的三个过滤器,如图4所示。多媒体框架的作用是协调各个过滤器的统一工作。在实现过程中,解码器可以采用现有的解码器,比如FFMPEG等,render可以采用操作系统默认的显示过滤器,接收过滤器需要单独编写;下面以windows平台下的多媒体框架directshow为例介绍接收过滤器的实现。作为一个源过滤器,可以通过如下代码向操作系统实现过滤器的注册constAMOVIESETUP—MEDIATYPEsud0pPinTypes={constAM0VIESETUP_PINsud0pPin&MEDIATYPE_Video,&MEDIASUBTYPEH2644&(XSID_NULL,〃Co騰ctstofilter亂L,//Connectstopin1,//Numberoftypes&sud0pPinTypes};//PindetailsconstAMOVIESETUP—FILTERsudPoliceax={&CLSID—Police_NetworkFiIter,〃FilterCLSIDL〃AAAPoliceNo3networkrecvfilter",//StringnameMERIT—N0薩L,〃Filtermerit1,//Numberpins&sud0pPin//Pindetails};//COMglobaltableofobjectsinthisdllCFactoryTemplateg_Templates[]={仏"AAAPoliceNo3networkrecvfilter",&(XSID_Po1ice_NetworkFi11er,CFilter—SRC::Createlnstance,NULL,&sudPoliceax}};intg_cTemplates=sizeof(g—Templates)/sizeof(g_Templates);//DllRegisterServerSTDAPIDllRegisterServer(){returnAMovieDllRegisterServer2(TRUE);}//DllUnregisterServerSTDAPIDllUnregisterServer(){returnAMovieDllRegisterServer2(FALSE);}extern"C〃B00LWINAPIDllEntryPoint(HINSTANCE,UL0NG,LPV0ID);B00LAPIENTRYDllMain(HMODULEhModule,DWORDdwReason,LPV0IDIpReserved){returnDllEntryPoint((HINSTANCE)(hModule),dwReason,IpReserved);}通过这段代码向系统注册了一个源过滤器类CFilter—SRC。在该类的构造函数中创建一个用于接收来自发送端数据的子线程。子线程启动后主动向发送端地址的相应端口号发起TCP连接,并接收来自发送端的视频流数据。子线程接收到的视频数据需要以帧为单位存放到子线程和源过滤器共享的环形缓冲区中。以化264协议为例,不同的帧(包括数据帧和控制帧)之间通过一个固定的起始码{0x00,0x00,0x00,0x01}进行分隔,通过如下代码可以实现视频流数据到视频帧的分割〃定义用于解析h.264帧的自动机状态类型typedefe皿mfsm_h264_t{FSM_NULL,FSM_SC0DE_0,FSM_SC0DE_1,FSM—SC0DE—2,FSM—SC0DE—3,FSM—DATA}fsm_h264_tt;〃根据的输入的内容抽取h.264的一帧数据sint32_ttCH264_Recv::fsm_h264_analysis(uint8_tt*pBuff_in,sint32_ttlen_in){constuint8_ttpSTART_C0DE[4]={0x00,0x00,0x00,0x01};〃固定的startcode的值sint32_ttretlen=0;〃返回值for(sint32_ttcoimter—pBuff=0;co皿ter—pBuff<len_in;counterpBuff++){〃初始化输入变量pBuff_cmp=pBuff_cmp[l];pBuff_cmp[l]=pBuff_cmp[2];pBuff_cmp[2]=pBuff_cmp[3];pBuff_cmp[3]=pBuff_in[counter_pBuff];switch(myfsm){caseFSM—亂L:〃还没有找至ljstartcodeif(0==memcmp(pBuff_cmp,pSTART_C0DE,4)){myfsm=FSM—SC0DE—0;}break;caseFSM_SC0DE_0:〃同步头的第一位myfsm=FSM—SC0DE—1;break;caseFSM_SC0DE_1:〃同步头的第二位myfsm=FSM_SC0DE_2;break;caseFSM_SC0DE_2:〃同步头的第三位myfsm=FSM—SC0DE—3;6break;caseFSM_SC0DE_3:〃同步头的第四位myfsm=FSM_DATA;break;caseFSM_DATA:〃除去同步头的数据部分if(0==memcmp(pBuff_cmp,pSTART_C0DE,4)){myfsm=FSM—SCODE—0;}break;default:break;}〃根据状态机的状态执行具体的操作switch(myfsm){caseFSM_SC0DE_0:〃记录数据if(length_frame>4){〃帧缓冲区中存在数据的情况下保存数据,过滤掉一开始的那些数据〃数据存放在pBuff_frame到pBuff_frame[framelength]这个范围内〃向环形buffer中写入一帧数据if(length—frame<=PKTLEN—RECV—DATA){this->pBufMan->buf_write(length_frame,pBuff_frame);retlen=length—frame;}else{〃超过缓冲区节点的大小的情况下丢弃该帧}〃重新初始化帧当前指针length—fr謙=4;}break;caseFSM_DATA:〃把当前的数据提取到帧缓冲区中pBuff—frame[length—frame]=pBuff_cmp5length_f:rame++;break;default:〃不执行任何操作break;70144]}0145]}0146]return(retlen);0147]}0148]环形缓冲区可以通过链表实现(如图3所示),如下的代码描述了缓冲区每个节点的数据结构0149]〃缓冲区节点数据结构0150]typedefstructbuf_node_t0151]{0152]uint8_ttpBuf[N0DELEN_H264_FRAME];0153]sint32_ttnodelen;0154]structbuf_node_t*pNext;0155]}buf_node_tt;0156]buf_node_tt*pRead;〃接收、转码缓冲区读取指针0157]buf_node_tt*pWrite;〃接收、转码缓冲区写入指针0158]系统定义两个用于实现环形缓冲区读写的指针。在完成缓冲区的初始化以后读写指针重合。在工作过程中,如果读指针不等于写指针,那么输出当前读指针指向的内容,并将读指针移向下一个节点,否则返回无数据状态。如果写指针的下一个节点不是读指针,那么将数据写入写指针指向节点的数据缓冲部分,并将写指针移向下一个节点。如果写指针的下一个节点是读指针,那么首先将读指针指向下一个节点,同时将数据写入写指针的指向节点的数据缓冲部分,最后将写指针指向下一个节点。覆盖旧数据的写入方式用于确保缓冲区中数据的实时性。由于缓冲区的读写由两个单独的线程完成,因此需要在读写前对缓冲区指针进行加锁操作。接收线程将每一帧数据写入环形缓冲区,源过滤器内部通过一个OutputPin的形式向下一个过滤器输送视频帧。OutputPin对象的Fillbuffer方法实现具体的数据填充工作。具体代码如下0160]HRESULTCPin—SRC::FillBufferaMediaSample*pms)0161]{0162]0163]0164]0165]0166]0167]0168]0169]0170]0171]0172]CheckPointer(pms,E_P0INTER);BYTE*pData;longIDateLen5sint32_ttreadbytes;uint8_ttpbuf[N0DELEN_H264_FRAME];pms_>GetPointer(&pData);IDataLen=pms_>GetSize();ZeroMemory(pData,IDataLen)5CAutoLockcAutoLockShared(&m_cSharedState)5do{〃用于填充数据部分readbytes=((CFilter_SRC*)this->m_pFilter)_>pBufMan->bufread(pbuf);:0174]if(readbytes>0):0175]{:0176]memcpy(pData,pbuf,readbytes);:0177]pms_>SetActimlDataLength(readbytes);:0178]REFERENCE—TMErtStop=m_rtStart;:0179]pms_>SetTime(&m_rtStart,&rtStop);:0180]pms_>SetSyncPoint(FALSE);:0181]m_rtStart=m_rtStart+FPS_12;:0182]}:0183]else:0184]{〃每秒帧的情况下,每帧ms:0185]Sle印(50);:0186]}:0187]}:0188]while(readbytes<=0);:0189]ret證(SJ)K);:0190]}:0191]在Fillbuffer方法中需要为每一帧数据打上时间戳,可以通过累加的方式为每帧数据打上开始时间和结束时间。随着时间的累计,会出现时间戳偏移的现象,可以通来自上一级过滤器的Notify消息进行矫正,如下代码所示STDMETHOD頂PCPin_SRC::Notify(IBaseFilter*pSender,Qualityq){if(q.Late>0){m_rtStart=m_rtStart+q.Late;}returnS_0K;}在完成接收过滤器的编写后,将三个过滤器连接起来就可以完成实时视频的接收、解码和显示。权利要求一种基于IP网络的实时视频传输方法,其特征在于,包括以下方法1)发送端和接收端在传输层使用TCP协议,提高数据传输的可靠性;2)接收端以图像帧(包括控制帧)为单位存放到接收缓冲区中,接收缓冲区以环形方式组织,在处理较慢的情况下可以使用最新的帧覆盖最过时的帧,保持数据的实时性;3)以directshow/gstreamer等作为多媒体框架,根据显示端的时钟反馈实时调节接收端视频帧的时间戳。2.根据权利要求1所述的传输方法,其特征在于所述的方法1)发送端实现视频实时采集,使用MPEG4/H.264等压縮算法进行视频压縮。3.根据权利要求l所述的传输方法,其特征在于所述的方法3)多媒体框架设置视频接收、解码和显示三个过滤器。全文摘要本发明为一种基于IP网络的实时视频传输方法,发送端和接收端在传输层使用TCP协议,提高数据传输的可靠性;接收端以图像帧为单位存放到接收缓冲区中,接收缓冲区以环形方式组织,在处理较慢的情况下可用最新的帧覆盖最过时的帧,保持数据的实时性;以directshow/gstreamer等作为多媒体框架,根据显示端的时钟反馈实时调节接收端视频帧的时间戳;本发明使用TCP协议作为传输层协议,有效提高视频传输的可靠性,解决网络传输的丢包和乱序问题,避免解码器出现不能正常解码的现象;以帧为单位将图像信息存放在环形缓冲区中,有效解决了延时和抖动问题;在接收端使用多媒体框架,根据显示过滤器的时钟反馈,实时调整接收过滤器的输出视频帧时间戳,使视频达到顺畅播放的效果。文档编号H04L29/06GK101783941SQ20091019568公开日2010年7月21日申请日期2009年9月15日优先权日2009年9月15日发明者刘广钟,高军申请人:上海海事大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1