微视U200视频采集卡 视频保存程序失败
购买了一个微视U200视频采集卡,要做一个C++保存视频的程序,按钮 IDC_BUTTON_COMPRESSAVI,对应函数void CRobotDlg::OnButtonCompressavi() 如下,编译时提示:
RobotDlg.obj : error LNK2001: unresolved external symbol "void __stdcall MV_AVIFileFini(void)"
RobotDlg.obj : error LNK2001: unresolved external symbol "int __stdcall MV_AVIFileOpen(int,char const *,struct tagBITMAPINFO *,unsigned short)"
RobotDlg.obj : error LNK2001: unresolved external symbol "void __stdcall MV_AVIFileInit(unsigned long,short)"
Debug/Robot.exe : fatal error LNK1120: 3 unresolved externals
按照网友的提示在.cpp文件中加入“#pragma comment(lib, "mvavi.lib")”或者在 project->setting->link->写上mvavi.lib文件,错误提示消失。但是运行时,保存的AVI视频永远是0字节。
我的程序程序基本和微视提供的C++程序一样,他的程序中也没有加入“#pragma comment(lib, "mvavi.lib")”或者在 project->setting->link->写上mvavi.lib文件,怎么没有错误提示,还能正常保存AVI视频呢?
函数在mvavi.h中如下定义,且这个也include在我的.cpp文件里了。
__declspec(dllexport) void __stdcall MV_AVIFileInit(DWORD filetype,short framerate);
__declspec(dllexport) void __stdcall MV_AVIFileFini();
__declspec(dllexport) BOOL __stdcall MV_AVIFileOpen(int index,LPCTSTR lpszFileName, LPBITMAPINFO alpb, WORD wSkipRate);
__declspec(dllexport) BOOL __stdcall MV_AVIFileAddFrame(int index, LPBITMAPINFO alpb, LPBYTE alpImageBits );
__declspec(dllexport) BOOL __stdcall MV_AVIFileVertFlipBuf(BYTE * inbuf, UINT widthBytes, UINT height);
void CRobotDlg::OnButtonCompressavi()
{
// TODO: Add your control notification handler code here
if(IsOpen==FALSE)
MessageBox( "摄像头未连接成功", "提示信息");
else
{
if(!bCompress)
{
MV_AVIFileInit(541215044, 25);
MV_IMAGEINFO info;
MV_SetDeviceParameter( curcard, SET_GARBIMAGEINFO, (DWORD)&info ); // 得到当前的图像的信息
m_pImageInfo = (BITMAPINFO *) new BYTE[sizeof( BITMAPINFO ) + (256 * sizeof( RGBQUAD )) ];
if ( m_pImageInfo == NULL ) return ;
m_pImageInfo->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
m_pImageInfo->bmiHeader.biWidth = info.Width;
m_pImageInfo->bmiHeader.biHeight = -info.Heigth;
m_pImageInfo->bmiHeader.biPlanes = 1;
m_pImageInfo->bmiHeader.biBitCount = info.nColor;
m_pImageInfo->bmiHeader.biCompression = BI_RGB;
m_pImageInfo->bmiHeader.biSizeImage = info.Length;
m_pImageInfo->bmiHeader.biXPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biYPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biClrUsed = (info.nColor <= 8) ? 256 : 0;
m_pImageInfo->bmiHeader.biClrImportant = (info.nColor <= 8) ? 256 : 0;
if(info.nColor==8)
{
for (UINT i = 0; i < 256; i++ )
{
m_pImageInfo->bmiColors[i].rgbBlue = (BYTE) i;
m_pImageInfo->bmiColors[i].rgbGreen = (BYTE) i;
m_pImageInfo->bmiColors[i].rgbRed = (BYTE) i;
m_pImageInfo->bmiColors[i].rgbReserved = 0;
}
}
char strPath[MAX_PATH] = TEXT("");
char strName[MAX_PATH] = TEXT("");
OPENFILENAME ofn= { sizeof(OPENFILENAME), NULL, NULL,
TEXT("AVI File\0*.avi\0\0"),
NULL, 0, 1, strName, MAX_PATH, NULL, 0, strPath, TEXT("Save Image File"),
OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_NOREADONLYRETURN, 0, 0, TEXT(".avi"), 0, NULL, NULL };
UpdateData(TRUE);
if( GetSaveFileName(&ofn) == FALSE ) return;
BOOL bOpen=MV_AVIFileOpen(0, strName, m_pImageInfo, 1);
if(bOpen)
{
MV_SetDeviceParameter( curcard, WORK_UPDOWN, 1 );
MV_SetDeviceParameter( curcard, DISP_PRESENCE, 0 );
m_ctrlCompressAvi.SetWindowText("停止存储");
bCompress=TRUE;
}
else
{
bCompress=FALSE;
MV_AVIFileFini();
delete m_pImageInfo;
}
}
else
{
m_ctrlCompressAvi.SetWindowText("存储视频");
MV_SetDeviceParameter( curcard, WORK_UPDOWN, 0 );
MV_SetDeviceParameter( curcard, DISP_PRESENCE, 1 );
bCompress=FALSE;
Sleep(100);
MV_AVIFileFini();
delete m_pImageInfo;
}
}
}