//回调函数,实现对视频采集卡传递进来的数据流的处理
WORD CALLBACK _loadds MyCallBack(HDRVR hdrvr, UINT msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
{
if(msg==VF_MSGUSER_BUF_WRITE)
{
LONG lRet;
MMIOINFO mmioinfoIn;
LPVF_BUFWRITE_STRUCT lpBufWrite = (LPVF_BUFWRITE_STRUCT)dwParam1;
//将传递进来的数据压入视频流缓冲区队列
if (g_pBuffer)
DWORD dwBytes = g_pBuffer->PushIn((LPSTR)lpBufWrite -> lpBuffer, (DWORD)lpBufWrite -> dwBufferWrite);
//如果现在在采集数据,将数据写入到采集文件中
if (m_Capture)
if(hmmioOutput)
{
lRet = mmioWrite(hmmioOutput, (LPSTR)lpBufWrite -> lpBuffer, (LONG)lpBufWrite -> dwBufferWrite);
mmioGetInfo(hmmioOutput,&mmioinfoIn, 0);
//采集文件满,发送停止采集消息
if(mmioinfoIn.lDiskOffset>(m_size*1024*1024))
::SendMessage(hWnd,WM_CAPTURE_STOP,0,0);
}
if (lRet == -1L)
return (FALSE);
}
return 1;
}
int CPlayView::InitDriver()
{
WORD flags;
//打开设备驱动
m_hVFDrv = OpenDriver (L"av8api.dll", NULL, NULL);
if (!m_hVFDrv)
{
MessageBox("Can't OpenDriver()");
return -1;
}
//检查是否有设备驱动可用,如有,将打开的设备与驱动程序关联起来
if (!HVFAssign(m_hVFDrv, 0))
{
MessageBox("没有合适的视频设备!");
return -1;
}
//锁定设备
HVFLock(m_hVFDrv, VF_CAP_ALL);
flags = VF_FLAG_MPEG | VF_FLAG_ENCODE | VF_FLAG_OUTBUF;
//打开流数据
m_bStream = static_cast<BYTE> (HVFOpen(m_hVFDrv, flags,
reinterpret_cast<unsigned long>(MyCallBack)));
//配置流数据的编码信息
InitEncodeVideoVxD();
InitEncodeAudioVxD();
//开始采集数据
if (m_bStream)
HVFRecord(m_hVFDrv, m_bStream, NULL, NULL);
return 0;
}