首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

视频会议中或许录播中使用RTP协议接收h264视频(二)

2012-11-26 
视频会议中或者录播中使用RTP协议接收h264视频(二) 在视频会议和录播中有一个最重要的环节是编码,假定我们

视频会议中或者录播中使用RTP协议接收h264视频(二)

 在视频会议和录播中有一个最重要的环节是编码,假定我们的编码系统在windows中,linux稍后讲,原理都是一样,那么在编码中比较重要的环节又是什么呢?如果我们对h264编码稍稍熟悉,就知道编码的帧率,分辨率,和时间戳以及pts dts(同步)是非常重要的,如果一个接收系统没有一个好的时间戳去取到数据或者一个编码系统没有使用正确的时间戳去编码,那么另外一端会出现各种各样的问题。
  编码时,我们假定每33毫秒编码一帧,那么我们怎么控制这个时间呢,要知道,做好这一步,才能做到正确地接收啊。我们程序员为了省事,喜欢使用GetTickCount()函数,即使知道他的时间精确度不高,而有的严谨但着急做完再说的一些,(其实很多),大部分是为了赶项目,先用完再说,这部分人又狠用QueryPerformanceCounter,QueryPerformanceFrequency函数,如下面一段代码:

unsigned int lasttick = timeGetTime();unsigned int framenum = 0;#define Ev_Frame_Time 33#define EV_Frame_Diff  5  //5毫秒误差时间while(1){        //帧数加1        framenum++;         //编码一帧,返回数据        unsigned char * pData =    EncodePic(BGRData);         //发送数据       SendData(pData);       unsigned int diff = timeGetTime()- lasttick;        if(diff <Ev_Frame_Time*framenum-EV_Frame_Diff )        {timeBeginPeriod(1);               Sleep(Ev_Frame_Time*framenum-EV_Frame_Diff -diff);               timeEndPeriod(1);        }      }

  好,另外一个使用windows的timeSetEnent方法,这个方法适用于回调以下是从代码中摘抄出来的,后面讲完就把代码放出,条件是首先理解这些东西,然后下载代码才能有用。
void Camera::Camera_Start(){timer_id = timeSetEvent(Ev_Frame_Time ,1, (LPTIMECALLBACK)onTimeFunc, DWORD(1), TIME_PERIODIC);   if(NULL == timer_id)   {   printf("timeSetEvent() failed with error %d\n", GetLastError());   //return 0;   } }void WINAPI onTimeFunc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)   {   frame =_ccamera.QueryFrame();if( !frame ){printf("this is an error for cvQueryFrame!\n");return;}int out_size=0;unsigned char *data = _h264endode.Encode(frame,out_size);if(out_size>=0){h264rtp.SendOneFrame((unsigned char*)data,out_size);}} 

   下一节我们再使用QueryPerformanceCounter来制定时间戳,未完 待续。。。。。。



热点排行