当前位置:首页 > 李娜多媒体网络通信技术
}else{
pChatRoom->ShowMsg(_T(\聊天服务器已停止,请重新进行连接! \break; } }
Sleep(500); }
__Error_End:
closesocket(pChatRoom->m_ConnectSock); return TRUE; }
3.2音视频采集与播放
利用VFW接口,视频捕获可以分为以下几个步骤:
(1)建立视频采集窗口:该窗口用来接收视频捕捉驱动程序传来的数据和消息。 (2)连接视频驱动程序:将建立的视频捕捉窗口与视频设备驱动程序相连。 (3)视频捕获初始化。
(4)视频捕捉设置:VFW下视频捕捉参数的设置可以通过调用函数或弹出对话框的形式来实现。一般视频驱动程序允许设置的参数包括视频源选择、视频格式、视频显示格式等。
(5)设置回调函数:通过回调函数来通知程序视频事件的发生,比如捕捉一帧图像成功的消息,捕捉出错的消息等。
(6)结束捕捉:结束捕捉是应该有一些清除工作。如释放分配的内存,断开捕捉窗口与视频捕捉驱动程序的连接,清除视频捕捉窗口等。
3.2.1捕获窗口
在捕获前必须创建一个捕获窗口(Capture Widnow),下面介绍有关捕获窗口的情况:创建一个AVICap捕获窗口,用capCreateCaptureWindow函数并返回一个句柄。将捕获窗口连接至捕获设备,用capDriverConnect函数来使一个捕获窗口与一个捕获设备连接或关联连接上后,就可以通过捕获窗口向捕获设备发送各种消息,可以使用函数capGetDriverDescription来获得已安装的捕获设备名称及版本,将其列举在实现程序过程
中。再利用capDriverGetName函数来得到捕获设备的名称将获得的版本发送到capDriverGetVersion。如果断开捕获窗口与捕获设备的连接用capDriverDisconnect。 捕获窗口的状态,用capGetStatus函数来获得当前捕获窗口的状态,得到一个
CAPSTATUS结构的拷贝。该结构的内容包含了图片的尺寸、卷轴的当前位置、overlay和preview是否已设置。由于其信息是动态的,每当捕获的视频流的尺寸发生改变,程序应该在获取捕获设备的视频格式以后及时进行刷新。而捕获窗口尺寸的改变并不影响实际的捕获视频流的尺寸。该尺寸由视频捕获设备的格式和视频对话框决定。代码如下: //捕获窗口
BOOL VideoCapture::Initialize() {
char devname[128]={0},devversion[128]={0}; int index=0;
BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(\ //创建一个AVICap捕获窗口
m_capwnd = capCreateCaptureWindow(\if(!m_capwnd){ return FALSE; }
//connect callback functions
ret = capSetUserData(m_capwnd,this); //Change destroy functions also........
ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); //得到已安装的捕获设备的名称及版本
ret2 = capGetDriverDescription(index,devname,100,devversion,100); // Connect to webcam driver
//使一个捕获窗口与一个捕获设备连接或关联 ret3 = capDriverConnect(m_capwnd,index); if(!(ret && ret1 && ret2 && ret3)){
// Device may be open already or it may not have been // closed properly last time.
AfxMessageBox(\//
log.WriteString(\
m_capwnd=NULL; return FALSE;}
// Set the capture parameters if(SetCapturePara()==FALSE) { //
log.WriteString(\
capDriverDisconnect(m_capwnd); //使捕获窗口与一个捕获设备断开 return FALSE; }
return TRUE; }
3.2.2设置CAPTUREPARAMS结构
VC++采用VFW技术,客户端通过capSetCallbackOnFrame()注册回调函数,当采集卡采集到一幅图像后,系统就会自动调用回调函数,在其中使用ICSeqCompressFrame()函数进行压缩。然后再通过Winsock将压缩后的数据发送到另一客户端。该客户端接收完一帧以后,交给ICDecompress()解压,最后用SetDIBitsToDevice()将图像显示出来。
基本的捕获设置包括设置捕获速度(每秒捕获多少帧)、是否同时捕获声频、捕获缓冲、允许最大丢失多少帧和是否使用DOS内存,以及使用键盘的哪个键或鼠标的哪个键来终止捕获等内容,这些设置使用CAPTUREPARAMS结构描述,capCaptureGetSetup宏来得到当前的设置,然后改变此结构的成员变量,再使用capCaptureSetSetup宏设置新的设置。
设置捕获速度,通过使用capCaptureGetSetup宏来得到当前的捕捉速度,将当前的捕捉速度保存在CAPTUREPARAMS结构的dwRequestMicroSecPerFrame成员变量中,也可以通过设置此变量来改变当前设置值。
设置终止捕获,也通过使用capCaptureGetSetup宏来得到当前的设置,当前按键设置保存在CAPTUREPARAMS结构的vKeyAbort成员中,鼠标设置保存在fAbortLeftMouse和fAbortRightMouse成员中,通过修改可以设置新的热健或者鼠标左右键,修改完成后,使用capCaptureSetSetup宏来进行更新。
捕获的时间限制,用CAPTUREPARAMS结构中的fLimitEnabled表示捕获是否有时间的限制,wTimeLimit用来设置指示捕获最大的持续时间,其单位为秒。使用capCaptureGetSetup宏来得到当前的设置值。
下面程序为设置CAPTUREPARAMS结构的实现代码: BOOL VideoCapture::SetCapturePara() {
CAPTUREPARMS CapParms={0};
capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms)); //得到当前的捕获速度
CapParms.fAbortLeftMouse = FALSE; CapParms.fAbortRightMouse = FALSE; CapParms.fYield = TRUE;
CapParms.fCaptureAudio = FALSE; CapParms.wPercentDropForError = 80;
if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms))) {
// log.WriteString(\return FALSE; }
// Set Video Format
capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo)); m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH; m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;
BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo)); //
log.WriteString(\
共分享92篇相关文档