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

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

Info

Publication number
CN101783941A
CN101783941A CN 200910195681 CN200910195681A CN101783941A CN 101783941 A CN101783941 A CN 101783941A CN 200910195681 CN200910195681 CN 200910195681 CN 200910195681 A CN200910195681 A CN 200910195681A CN 101783941 A CN101783941 A CN 101783941A
Authority
CN
China
Prior art keywords
frame
video
transmission
real
data
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.)
Granted
Application number
CN 200910195681
Other languages
English (en)
Other versions
CN101783941B (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.)
Shanghai Jinshan petrochemical logistics Limited by Share Ltd
Original Assignee
Shanghai Maritime University
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 Shanghai Maritime University filed Critical Shanghai Maritime University
Priority to CN 200910195681 priority Critical patent/CN101783941B/zh
Publication of CN101783941A publication Critical patent/CN101783941A/zh
Application granted granted Critical
Publication of CN101783941B publication Critical patent/CN101783941B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Compression Or Coding Systems Of Tv Signals (AREA)

Abstract

本发明为一种基于IP网络的实时视频传输方法,发送端和接收端在传输层使用TCP协议,提高数据传输的可靠性;接收端以图像帧为单位存放到接收缓冲区中,接收缓冲区以环形方式组织,在处理较慢的情况下可用最新的帧覆盖最过时的帧,保持数据的实时性;以directshow/gstreamer等作为多媒体框架,根据显示端的时钟反馈实时调节接收端视频帧的时间戳;本发明使用TCP协议作为传输层协议,有效提高视频传输的可靠性,解决网络传输的丢包和乱序问题,避免解码器出现不能正常解码的现象;以帧为单位将图像信息存放在环形缓冲区中,有效解决了延时和抖动问题;在接收端使用多媒体框架,根据显示过滤器的时钟反馈,实时调整接收过滤器的输出视频帧时间戳,使视频达到顺畅播放的效果。

Description

一种基于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协议作为传输层协议,有效提高视频传输的可靠性,解决网络传输的丢包和乱序问题,避免解码器出现不能正常解码的现象;以帧为单位将图像信息存放在环形缓冲区中,有效解决了延时和抖动问题;在接收端使用多媒体框架,根据显示过滤器的时钟反馈,实时调整接收过滤器的输出视频帧时间戳,使视频达到顺畅播放的效果。
附图说明
图1整系统结构图;
图2网络传输报文结构;
图3接收端缓冲区结构:
图4接收端多媒体框架。
具体实施方式
下面通过一个实施案例,进一步说明本发明。
整个系统主要包括两个大的组成部分:发送端和接收端(整系统结构见图1);发送端实现视频的实时采集,并使用MPEG4/H.264等压缩算法进行视频压缩。发送端拥有固定的公网IP地址,在某个固定的TCP端口进行监听,等待来自客户端的视频请求,将压缩后的视频数据包含到TCP报文的内容部分并发送给接收端(网络报文结构图见图2);如果发送端和接收端都没有固定的公网IP地址(比如通过NAT方式访问互联网),则需要具有公网地址的第三方服务器实现数据中转。
接收端通过directshow/gstreamer等多媒体框架实现。在多媒体框架下,包含了用于实现视频接收、解码和显示的三个过滤器,如图4所示。多媒体框架的作用是协调各个过滤器的统一工作。在实现过程中,解码器可以采用现有的解码器,比如FFMPEG等,render可以采用操作系统默认的显示过滤器,接收过滤器需要单独编写;
下面以windows平台下的多媒体框架directshow为例介绍接收过滤器的实现。
作为一个源过滤器,可以通过如下代码向操作系统实现过滤器的注册:
const AMOVIESETUP_MEDIATYPE sudOpPinTypes=
{
     &MEDIATYPE_Video,
     &MEDIASUBTYPE_H264
};
const AMOVIESETUP_PIN sudOpPin=
{
     L″Output″, //Pin string name
     FALSE,       //Is it rendered
     TRUE,        //Is it an output
     FALSE,       //Can we have none
     FALSE,       //Can we have many
     &CLSID_NULL, //Connects to filter
     NULL,        //Connects to pin
     1,           //Number of types
     &sudOpPinTypes
};                              //Pin details
const AMOVIESETUP_FILTER sudPoliceax=
{
     &CLSID_Police_NetworkFilter,            //Filter CLSID
     L″AAA Police No3 network recv filter″,//String name
    MERIT_NORMAL,                            //Filter merit
    1,                                       //Number pins
     &sudOpPin                                //Pin details
 };                              //COM global table of objects in this dll
 CFactoryTemplate g_Templates[]={
 {L″AAA Police No3 network recv filter″
,&CLSID_Police_NetworkFilter
,CFilter_SRC::CreateInstance
,NULL
,&sudPoliceax}
};
int g_cTemplates=sizeof(g_Templates)/sizeof(g_Templates[0]);
//DllRegisterServer
STDAPI DllRegisterServer()
{
   return AMovieDllRegisterServer2(TRUE);
}                                           //DllUnregisterServer
STDAPI DllUnregisterServer()
{
    return AMovieDllRegisterServer2(FALSE);
}
extern″C″BOOL WINAPI DllEntryPoint(HINSTANCE,ULONG,LPVOID);
BOOL APIENTRY DllMain(HMODULE hModule,
                     DWORD dwReason,
                     LPVOID lpReserved
                )
{
     return DllEntryPoint((HINSTANCE)(hModule),dwReason,lpReserved);
}
通过这段代码向系统注册了一个源过滤器类CFilter_SRC。在该类的构造函数中创建一个用于接收来自发送端数据的子线程。子线程启动后主动向发送端地址的相应端口号发起TCP连接,并接收来自发送端的视频流数据。子线程接收到的视频数据需要以帧为单位存放到子线程和源过滤器共享的环形缓冲区中。以H.264协议为例,不同的帧(包括数据帧和控制帧)之间通过一个固定的起始码{0x00,0x00,0x00,0x01}进行分隔,通过如下代码可以实现视频流数据到视频帧的分割:
//定义用于解析h.264帧的自动机状态类型
typedef enum fsm_h264_t{FSM_NULL,FSM_SCODE_0,FSM_SCODE_1,
FSM_SCODE_2,FSM_SCODE_3,FSM_DATA}fsm_h264_tt;
//根据的输入的内容抽取h.264的一帧数据
sint32_ttCH264_Recv::fsm_h264_analysis(uint8_tt*pBuff_in,sint32_tt len_in)
{
   const uint8_tt pSTART_CODE[4]={0x00,0x00,0x00,0x01};
//固定的start code的值
  sint32_tt  retlen=0;                     //返回值
  for(sint32_tt counter_pBuff=0;counter_pBuff<len_in;counter_pBuff++)
  {                            //初始化输入变量
      pBuff_cmp[0]=pBuff_cmp[1];
      pBuff_cmp[1]=pBuff_cmp[2];
pBuff_cmp[2]=pBuff_cmp[3];
      pBuff_cmp[3]=pBuff_in[counter_pBuff];
      switch(myfsm)
      {
      case FSM_NULL:             //还没有找到startcode
         if(0==memcmp(pBuff_cmp,pSTART_CODE,4))
         {
              myfsm=FSM_SCODE_0;
         }
         break;
     case FSM_SCODE_0:        //同步头的第一位
         myfsm=FSM_SCODE_1;
         break;
     case FSM_SCODE_1:       //同步头的第二位
         myfsm=FSM_SCODE_2;
    break;
case FSM_SCODE_2:                  //同步头的第三位
    myfsm=FSM_SCODE_3;
    break;
case FSM_SCODE_3:                  //同步头的第四位
    myfsm=FSM_DATA;
   break;
case FSM_DATA:                    //除去同步头的数据部分
   if(0==memcmp(pBuff_cmp,pSTART_CODE,4))
   {
         myfsm=FSM_SCODE_0;
   }
   break;
default:
   break;
}                             //根据状态机的状态执行具体的操作
switch(myfsm)
{
case FSM_SCODE_0:             //记录数据
   if(length_frame>4)
   {
//帧缓冲区中存在数据的情况下保存数据,过滤掉一开始的那些数据
//数据存放在pBuff_frame[0]到pBuff_frame[framelength]这个范围内
//向环形buffer中写入一帧数据
             if(length_frame<=PKTLEN_RECV_DATA)
             {
                  this->pBufMan->buf_write(length_frame,pBuff_frame);
                  retlen=length_frame;
            }
            else
            {               //超过缓冲区节点的大小的情况下丢弃该帧
             }                  //重新初始化帧当前指针
             length_frame=4;
          }
          break;
       case FSM_DATA:         //把当前的数据提取到帧缓冲区中
          pBuff_frame[length_frame]=pBuff_cmp[0];
          length_frame++;
          break;
       default:               //不执行任何操作
          break;
       }
   }
   return(retlen);
}
环形缓冲区可以通过链表实现(如图3所示),如下的代码描述了缓冲区每个节点的数据结构:
//缓冲区节点数据结构
typedef struct buf_node_t
{
    uint8_tt            pBuf[NODELEN_H264_FRAME];
    sint32_tt           nodelen;
    struct buf_node_t   *pNext;
}buf_node_tt;
buf_node_tt*pRead;        //接收、转码缓冲区读取指针
buf_node_tt*pWrite;       //接收、转码缓冲区写入指针
系统定义两个用于实现环形缓冲区读写的指针。在完成缓冲区的初始化以后读写指针重合。在工作过程中,如果读指针不等于写指针,那么输出当前读指针指向的内容,并将读指针移向下一个节点,否则返回无数据状态。如果写指针的下一个节点不是读指针,那么将数据写入写指针指向节点的数据缓冲部分,并将写指针移向下一个节点。如果写指针的下一个节点是读指针,那么首先将读指针指向下一个节点,同时将数据写入写指针的指向节点的数据缓冲部分,最后将写指针指向下一个节点。覆盖旧数据的写入方式用于确保缓冲区中数据的实时性。由于缓冲区的读写由两个单独的线程完成,因此需要在读写前对缓冲区指针进行加锁操作。
接收线程将每一帧数据写入环形缓冲区,源过滤器内部通过一个Output Pin的形式向下一个过滤器输送视频帧。Output Pin对象的Fillbuffer方法实现具体的数据填充工作。具体代码如下:
HRESULT CPin_SRC::FillBuffer(IMediaSample*pms)
{
CheckPointer(pms,E_POINTER);
BYTE         *pData;
long         lDataLen;
sint32_tt    readbytes;
uint8_tt     pbuf[NODELEN_H264_FRAME];
pms->GetPointer(&pData);
lDataLen=pms->GetSize();
ZeroMemory(pData,lDataLen);
CAutoLock cAutoLockShared(&m_cSharedState);
do
{                              //用于填充数据部分
readbytes=((CFilter_SRC*)this->m_pFilter)->pBufMan->buf_read(pbuf);
if(readbytes>0)
{
       memcpy(pData,pbuf,readbytes);
       pms->SetActualDataLength(readbytes);
       REFERENCE_TIME rtStop=m_rtStart;
       pms->SetTime(&m_rtStart,&rtStop);
           pms->SetSyncPoint(FALSE);
           m_rtStart=m_rtStart+FPS_12;
       }
       else
       {                    //每秒帧的情况下,每帧ms
       Sleep(50);
   }
    }
    while(readbytes<=0);
    return(S_OK);
}
在Fillbuffer方法中需要为每一帧数据打上时间戳,可以通过累加的方式为每帧数据打上开始时间和结束时间。随着时间的累计,会出现时间戳偏移的现象,可以通来自上一级过滤器的Notify消息进行矫正,如下代码所示:
    STDMETHODIMP CPin_SRC::Notify(IBaseFilter*pSender,
Quality q)
{
    if(q.Late>0)
    {
         m_rtStart=m_rtStart+q.Late;
    }
    return S_OK;
}
在完成接收过滤器的编写后,将三个过滤器连接起来就可以完成实时视频的接收、解码和显示。

Claims (3)

1.一种基于IP网络的实时视频传输方法,其特征在于,包括以下方法:
1)发送端和接收端在传输层使用TCP协议,提高数据传输的可靠性;
2)接收端以图像帧(包括控制帧)为单位存放到接收缓冲区中,接收缓冲区以环形方式组织,在处理较慢的情况下可以使用最新的帧覆盖最过时的帧,保持数据的实时性;
3)以directshow/gstreamer等作为多媒体框架,根据显示端的时钟反馈实时调节接收端视频帧的时间戳。
2.根据权利要求1所述的传输方法,其特征在于:所述的方法1)发送端实现视频实时采集,使用MPEG4/H.264等压缩算法进行视频压缩。
3.根据权利要求1所述的传输方法,其特征在于:所述的方法3)多媒体框架设置视频接收、解码和显示三个过滤器。
CN 200910195681 2009-09-15 2009-09-15 一种基于ip网络的实时视频传输方法 Active CN101783941B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN 200910195681 CN101783941B (zh) 2009-09-15 2009-09-15 一种基于ip网络的实时视频传输方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN 200910195681 CN101783941B (zh) 2009-09-15 2009-09-15 一种基于ip网络的实时视频传输方法

Publications (2)

Publication Number Publication Date
CN101783941A true CN101783941A (zh) 2010-07-21
CN101783941B CN101783941B (zh) 2011-12-14

Family

ID=42523730

Family Applications (1)

Application Number Title Priority Date Filing Date
CN 200910195681 Active CN101783941B (zh) 2009-09-15 2009-09-15 一种基于ip网络的实时视频传输方法

Country Status (1)

Country Link
CN (1) CN101783941B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102033730A (zh) * 2010-11-04 2011-04-27 武汉钢铁(集团)公司 将DirectShow视频数据转换为高性能Java图像缓冲的方法
CN102630007A (zh) * 2012-03-31 2012-08-08 中船重工(武汉)凌久高科有限公司 一种处理tcp视频数据流的方法
CN102710983A (zh) * 2012-04-16 2012-10-03 杭州米加科技有限公司 一种从多媒体中抽取音视频的方法
CN103491426A (zh) * 2013-08-31 2014-01-01 中山大学 一种iptv的视频点播系统
CN103731409A (zh) * 2012-10-16 2014-04-16 罗伯特·博世有限公司 用于具有tcp加速的嵌入式汽车采集设备的分布式测量装置
CN105263021A (zh) * 2015-10-13 2016-01-20 华南理工大学 一种基于uvd的hevc视频解码方法
CN106293888A (zh) * 2015-06-04 2017-01-04 北京国双科技有限公司 数据的抓包、存盘方法及数据的抓包、存盘装置
CN111131785A (zh) * 2019-12-30 2020-05-08 元力(天津)科技有限公司 基于DirectShow的MPEG-4视频传输系统
CN113194318A (zh) * 2021-04-26 2021-07-30 鸣飞伟业技术有限公司 一种无hdcp认证反馈的数据传输方法
CN115242735A (zh) * 2022-09-22 2022-10-25 中邮消费金融有限公司 一种实时语音流切片分析方法、系统及计算机设备

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1933594A (zh) * 2005-09-14 2007-03-21 王世刚 多路音视频数据网络传输与同步播放的方法

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102033730B (zh) * 2010-11-04 2012-05-30 武汉钢铁(集团)公司 将DirectShow视频数据转换为高性能Java图像缓冲的方法
CN102033730A (zh) * 2010-11-04 2011-04-27 武汉钢铁(集团)公司 将DirectShow视频数据转换为高性能Java图像缓冲的方法
CN102630007A (zh) * 2012-03-31 2012-08-08 中船重工(武汉)凌久高科有限公司 一种处理tcp视频数据流的方法
CN102630007B (zh) * 2012-03-31 2015-07-22 中船重工(武汉)凌久高科有限公司 一种处理tcp视频数据流的方法
CN102710983A (zh) * 2012-04-16 2012-10-03 杭州米加科技有限公司 一种从多媒体中抽取音视频的方法
CN102710983B (zh) * 2012-04-16 2015-01-07 杭州米加科技有限公司 一种从多媒体中抽取音视频的方法
US10440157B2 (en) 2012-10-16 2019-10-08 Robert Bosch Gmbh Distributed measurement arrangement for an embedded automotive acquisition device with TCP acceleration
CN103731409A (zh) * 2012-10-16 2014-04-16 罗伯特·博世有限公司 用于具有tcp加速的嵌入式汽车采集设备的分布式测量装置
CN103731409B (zh) * 2012-10-16 2019-10-15 罗伯特·博世有限公司 用于具有tcp加速的嵌入式汽车采集设备的分布式测量装置
CN103491426A (zh) * 2013-08-31 2014-01-01 中山大学 一种iptv的视频点播系统
CN106293888A (zh) * 2015-06-04 2017-01-04 北京国双科技有限公司 数据的抓包、存盘方法及数据的抓包、存盘装置
CN105263021B (zh) * 2015-10-13 2018-04-13 华南理工大学 一种基于uvd的hevc视频解码方法
CN105263021A (zh) * 2015-10-13 2016-01-20 华南理工大学 一种基于uvd的hevc视频解码方法
CN111131785A (zh) * 2019-12-30 2020-05-08 元力(天津)科技有限公司 基于DirectShow的MPEG-4视频传输系统
CN113194318A (zh) * 2021-04-26 2021-07-30 鸣飞伟业技术有限公司 一种无hdcp认证反馈的数据传输方法
CN115242735A (zh) * 2022-09-22 2022-10-25 中邮消费金融有限公司 一种实时语音流切片分析方法、系统及计算机设备

Also Published As

Publication number Publication date
CN101783941B (zh) 2011-12-14

Similar Documents

Publication Publication Date Title
CN101783941B (zh) 一种基于ip网络的实时视频传输方法
WO2023024834A1 (zh) 一种游戏数据处理方法、装置及存储介质
Zambelli IIS smooth streaming technical overview
CN101198045B (zh) 一种流媒体数字水印系统
CN113225598B (zh) 移动端音视频同步的方法、装置、设备及存储介质
US7664872B2 (en) Media transfer protocol
WO2012097549A1 (zh) 一种共享音频和/或视频的方法及系统
CN101325702B (zh) 流媒体可见水印实时嵌入系统及其服务器端、客户端
CN105577819B (zh) 一种虚拟化桌面的分享系统、分享方法以及分享装置
CN107005729A (zh) 用于多媒体和文件传输的传输接口
KR20170074866A (ko) 수신 장치, 송신 장치, 및 데이터 처리 방법
WO2008061416A1 (fr) Procédé et système permettant d'accepter des données media de divers formats de codage
KR20160106718A (ko) 브로드캐스트 채널을 통한 dash 콘텐츠 스트리밍 방법 및 장치
US10477282B2 (en) Method and system for monitoring video with single path of video and multiple paths of audio
EP2829076A1 (en) Method of buffer management for synchronization of correlated media presentations
CN112770122B (zh) 一种在云导播台视频同步的方法及系统
EP3291569A1 (en) Reception device, transmission device, and data processing method
CN103856787A (zh) 基于公网的带解说音频回传的直播系统及其直播方法
CN108494792A (zh) 一种flash播放器播放hls视频流的转换系统及其工作方法
JP2001245281A (ja) ネットワークシステム
CN114554277B (zh) 多媒体的处理方法、装置、服务器及计算机可读存储介质
EP3214845A1 (en) Reception device, transmission device, and data processing method
CN104639979A (zh) 视频分享方法及系统
CN1327443C (zh) 一种流媒体点播的音视频切换方法
US10425689B2 (en) Reception apparatus, transmission apparatus, and data processing method

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
ASS Succession or assignment of patent right

Owner name: SHANGHAI JINSHAN PETRIFACTION LOGISTICS CO., LTD.

Free format text: FORMER OWNER: SHANGHAI MARITIME UNIV.

Effective date: 20130624

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 200135 PUDONG NEW AREA, SHANGHAI TO: 201400 FENGXIAN, SHANGHAI

TR01 Transfer of patent right

Effective date of registration: 20130624

Address after: 201400 days of Shanghai Chemical Industrial Zone No. 305 Hua Road

Patentee after: Shanghai Jinshan Petrochemical Logistics Co.,Ltd.

Address before: 200135 No. 1550, Pudong Avenue, Pudong New Area, Shanghai

Patentee before: Shanghai Maritime University

CP03 Change of name, title or address
CP03 Change of name, title or address

Address after: 201507 Shanghai city Jinshan District Chemical Industrial Zone Road No. 305 days

Patentee after: Shanghai Jinshan petrochemical logistics Limited by Share Ltd

Address before: 201400 days of Shanghai Chemical Industrial Zone No. 305 Hua Road

Patentee before: Shanghai Jinshan Petrochemical Logistics Co.,Ltd.