基于VC的网络化视频监视设计

时间:2022-03-16 10:47:54

基于VC的网络化视频监视设计

摘要:网络化视频监视是远程视频监控、远程视频会议等应用的基础,采用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.

上一篇:计算机视觉导航综述 下一篇:构建基于流媒体的远程教育平台