时间:2022-03-16 10:47:54
摘要:网络化视频监视是远程视频监控、远程视频会议等应用的基础,采用Microsoft提供的VFW技术,获取摄像头视频信号,通过C/S模式通信编程,实现网络化视频监视功能。该程序可以使用于集中视频监视、远程视频会话等场合,具有应用范围广、通用性强、编程相对简单、成本低、可靠性高等优势。
关键词:网络化;视频;监视
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)09-11583-03
The Design of the Networking Video Monitor Based on VC
FU Wen-jun, DUAN Jiang-chun, CHEN Lin
(Unit 69046, URUMQI 830002, China)
Abstract: Networking video monitor is the base of remote video M&C and remote video conference.This system bases on video capture of the Microsoft VFW technology.the structure is based on the C/S.This system can be used in the area on centralizing video monitor and remote video conference,has the advantages of widely used area,simplely programming,low cost and high reliability.
Key words: Networking; Video; Monitor
1 引言
网络化视频监视程序在网络化视频监控、视频会议等领域广泛应用,Microsoft公司提供了VFW技术,实现摄像头视频监视功能;通过SOCKET技术,基于C/S架构通信编程,实现网络化视频监视功能。
2 总体设计
该系统由一台视频服务器和若干视频客户机组成,服务器端可以监视所有客户机视频信号,各客户机在服务器授权下可以监视其他客户机视频信号。编程平台为Visual C++6.0,采用VFW提供的库函数和宏编写视频获取,采用CSOCKET套接字类实现网络图像传输,综合实现网络化视频监视程序。系统总体结构如图1所示。
3 视频捕获设计
视频获取程序部分主要采用Microsoft公司提供的VFW技术,VFW技术的实现是通过提供库函数和宏,供用户调用。函数和宏包含在vfw.h文件中,用于连接vfw32.lib库文件。主要的视频函数和宏有:(1)capCreateCaptureWindow函数创建视频捕获窗口;capDriverConnect宏将视频捕获窗口连接到视频驱动程序;capPreviewRate宏设置预览模式显示帧速率;capPreview宏激活或禁止预览模式;(2)capFileSetCaptureFile宏用于设置视频捕获的文件名称;capCaptureSequence宏用于初始化视频流,捕获视频信息到文件;(3)CapSetCallbackOnFrame宏为预览模式帧回调函数;capFileSaveDIB宏为帧保存为图片。其具体应用参见第4节:网络化通信设计。
4 网络化通信设计
客户端连接服务器后,客户端的视频图像就可以显示在服务器的预览窗口,在服务器端就可以实现网络化集中视频监测。
4.1 客户端程序设计
从CSocket类派生子类CclientSocket并改写其OnReceive方法,添加数据发送函数SendData()。其部分程序代码如下所示。
void CClientSocket::OnReceive(int nErrorCode)
{m_pDlg->ReceiveData(this);
……
}
void CFwjClientDlg::ReceiveData(CClientSocket *sock)
{char a[1];
sock->Receive(a,1);
m_IsReceived = TRUE;
}
在线程函数中实现监视窗口建立。
UINT CFwjClientDlg::ThreadFun( LPVOID wParam )
{
CFwjClientDlg * temp = (CFwjClientDlg *)wParam;
temp->m_hVideoWnd=capCreateCaptureWindow("Capture",WS_POPUP,5,5,20,20,*temp,0);
hTemp = temp->m_hVideoWnd;
if (temp->m_hVideoWnd )
{temp->m_Event.SetEvent();
MSG msg;
while (GetMessage(&msg,temp->m_hVideoWnd,0,0))
{TranslateMessage(&msg);
DispatchMessage(&msg);
}
……
return msg.wParam;
}
return 0;
}
在窗口初始化函数中,初始化视频捕获参数。
BOOL CFwjClientDlg::OnInitDialog()
{
…… //窗口初始化部分
m_pThread = AfxBeginThread(ThreadFun,(LPVOID)this);
m_Event.ResetEvent();
::WaitForSingleObject(m_Event,INFINITE);
if (m_hVideoWnd)
{
if (capDriverConnect(m_hVideoWnd,0)==FALSE)
{MessageBox("连接驱动程序出错");
return 0;
}
::SetParent(m_hVideoWnd,*this);
::SetWindowLong(m_hVideoWnd,GWL_STYLE,WS_CHILD);
::SetWindowPos(m_hVideoWnd,0,10,10,300,300,SWP_NOREDRAW);
::ShowWindow(m_hVideoWnd,SW_SHOW);
capPreviewRate(m_hVideoWnd,10);
capPreview(m_hVideoWnd,TRUE);
capOverlay(m_hVideoWnd,TRUE);
}
……
return TRUE;
}
数据发送函数。
void CFwjClientDlg::SendData()
{……
if (m_IsReceived)
{m_IsReceived = FALSE;
m_IsSending = TRUE;
CFile file("c:\\a.bmp",CFile::modeRead);
DWORD size = file.GetLength();
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,size);
void* lpBuf = GlobalLock(hGlobal);
file.ReadHuge(lpBuf,size);
m_pSock->Send(lpBuf,size);
char a[1]={'^'};//结束符
m_pSock->Send(a,1);
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
m_IsSending = FALSE;
}
……
}
4.2 服务器端程序设计
从CSocket类派生子类CserverSocket,作为服务器端套接字,并改写其对话框的构造函数和OnAccept方法,添加数据接收函数ReceiveData()方法。其部分程序代码如下所示。
void CServerSocket::OnAccept(int nErrorCode)
{m_pDlg->AcceptConnect();
CSocket::OnAccept(nErrorCode);
}
void CUuuuDlg::ReceiveData(CClientSocket *sock)
{……HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,999999);
void* lpBuf = GlobalLock(hGlobal);
DWORD size= sock->Receive(lpBuf,999999);
if (m_IsStop)
{m_file.Open("c:\\b.bmp",CFile::modeCreate|CFile::modeWrite);
m_file.WriteHuge(lpBuf,size);
m_IsStop = FALSE;
m_IsReceived = FALSE;
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
return;
}
char* temp = (char*)lpBuf;
if ((temp[size-1]=='^'))
{m_file.Close();
m_IsStop = TRUE;
m_IsReceived =TRUE;
char temp[1]={'a'};
sock->Send(temp,1);
}
else
{m_file.WriteHuge(lpBuf,size);
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
}
}
5 结束语
通过客户端与服务器端编程,实现了基于C/S架构的网络化视频监控系统,该系统可以应用于局域条件下的网络化视频监视,稍加改造可以用于视频会议等方面。具有广泛的应用前景。
参考文献:
[1] 明日科技. Visual C++程序开发范例宝典[M]. 北京:人民邮电出版社,2007.
[2] 高守传,聂云铭,郑静,等. Visual C++6.0开发指南[M]. 北京:人民邮电出版社,2007.
[3] 胡志坤,秦业,鄢锋,等. Visual C++通信编程工程实例精解[M]. 北京:机械工业出版社,2007.
[4] 求是科技. Visual C++6.0信息管理系统开发实例导航[M]. 北京:人民邮电出版社,2005.