微视U200视频采集卡 视频保存程序失败

guodanpi000000 2009-09-29 03:09:45
购买了一个微视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;
}

}
}

...全文
448 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lk_cool 2009-10-14
  • 打赏
  • 举报
回复
他有个技术文档,你可以看看怎么用。他们网站上有下载的。
liuchui2009 2009-10-13
  • 打赏
  • 举报
回复
由于我也写过类似的代码
所以很仔细的看了你的代码
不知道是因为我水平太菜还是因为你的代码从头至尾只有一句注释,加上你的是一段代码不是整个工程,所以我差不多是在猜你的代码的细节意思
所以对你的代码就不好做评论

我刚做这种项目的时候,也经常出现你说的这种“保存的AVI视频永远是0字节”的情况,但是查来查去原因都是因为我要保存的视频对象里面是空的数据(原因很多种,比如你抓拍不成功等),建议楼主仔细检查代码。
liumenghappy 2009-10-11
  • 打赏
  • 举报
回复
UP
LPR_Pro 2009-10-11
  • 打赏
  • 举报
回复
UP
fly113 2009-10-10
  • 打赏
  • 举报
回复
这个问题。。。。。。
想来楼主做这一类采集的工作还没有什么经验,想起当初自己也是这样从什么都不懂,模仿别人程序写起步的。还是有些感概。
好了,言归正传。
楼主的这个函数其实只是保存视频的一个初始命令或者结束命令函数
简单说,存储视频需要3个步骤
1、初始化各种参数,初始化数据文件,初始化采集卡等工作。在你的这几个AVI函数里,MV_AVIFileInit是这一步需要做的
2、当一帧视频信号到来时,Grab此帧数据,并将其写入视频文件。MV_AVIFileAddFrame是这一步应该做的
3、保存完毕了,就要结束保存,有些时候还需要把数据压缩或者重新写入到一个文件,AVIFileFini这个函数我猜是这一步要做的(不确定)
好了,说了这些,楼主需要做的就是把第2步补上,1、3步都是这一个函数完成了。但是没有MV_AVIFileAddFrame往视频文件里添加数据。
添加数据一般说来在回调函数里做,采集卡的数据缓冲区每填满一次,回调函数就会响应一次,你要做的就是拿到缓冲区的数据,并将其通过MV_AVIFileAddFrame写入视频文件。也有的采集不放在回调函数里,而是自己设定了一个OnTimer定时器,在响应函数里做。这种方式不推荐,一般采集卡都会有注册回调函数的接口。
所以楼主犯的错误是知道这个函数用来做存视频的,所以照搬这个函数,但是却不知道存视频还需要有其他函数来写入。赶快找找你的Demo程序里的MV_AVIFileAddFrame在哪吧。
dirdirdir3 2009-10-09
  • 打赏
  • 举报
回复
单点跟踪一下,看看流程是不是和你设想的一样,一切正常......................
怀疑是你开始了之后马上又关闭了.......

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧