着急啊!大牛们!winform VCap2860sdk的摄像头录像问题

EnForGrass 2011-12-28 01:33:52
VCap2860sdk中的devwdm.dll已经正确导入
//导入DLL文件
[DllImport("devwdm.dll")]
public static extern int devwdm_InitCard(int nID, IntPtr hwnd, int nWidth, int nHeight);
[DllImport("devwdm.dll")]
public static extern int devwdm_CloseCard(int nID);

[DllImport("devwdm.dll")]
public static extern int devwdm_StartCaptureMp4(int nID, string strFileName, int fbAudio);
[DllImport("devwdm.dll")]
public static extern int devwdm_stopCaptureMp4(int nID);
我现在有两个窗体form1,form2,form1中实现了拍照、录像,form1上有个按钮button,点击button,转向form2。form2也进行拍照、录像,拍照没问题,但是录像(函数:devwdm_StartCaptureMp4)去提示尝试读取或写入受保护的内存。这通常指示其他内存一损坏?,只要不录像就不会出现错误,调试很久了,一直都没有解决,各位大神,帮帮忙啊!
...全文
384 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
EnForGrass 2011-12-30
  • 打赏
  • 举报
回复
没人回答,我结贴了哦。自己慢慢找原因
liyangfd 2011-12-29
  • 打赏
  • 举报
回复
LONG APIENTRY devwdm_StartCaptureMp4(int nID, char* strFileName);



[DllImport("devwdm.dll", CharSet = CharSet.Ansi)]
public static extern LONG devwdm_StartCaptureMp4(int nID, string strFileName);
用这个测试下

EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sdl2005lyx 的回复:]

那你这样尝试:

你把工程属性:调试-》勾上“启用非托管代码调试”,

F11直接根据C++的代码,单步调试,查看是那句代码出错!
[/Quote]

调试了,录像时,提示错误,崩溃了
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
最开始我是这样引用的
[DllImport("devwdm.dll")]
public static extern int devwdm_InitCard(int nID, IntPtr hwnd, int nWidth, int nHeight);
[DllImport("devwdm.dll")]
public static extern int devwdm_CloseCard(int nID);

[DllImport("devwdm.dll")]
public static extern int devwdm_StartCaptureMp4(int nID, string strFileName);
[DllImport("devwdm.dll")]
public static extern int devwdm_stopCaptureMp4(int nID);
[DllImport("devwdm.dll")]
public static extern int devwdm_SetVideoStandard(int nID, int VideoStandard);
[DllImport("devwdm.dll")]
public static extern int devwdm_SaveBmpFile(int nID, string strFileName);
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
我觉得可能我dll引用不正确

这是我的dll的C++函数
C#中我是这样引用的
[DllImport("devwdm.dll",CharSet=CharSet.Auto)]
public static extern int devwdm_InitCard(int nID, IntPtr hwnd, int nWidth, int nHeight);
[DllImport("devwdm.dll", CharSet = CharSet.Auto)]
public static extern int devwdm_CloseCard(int nID);

[DllImport("devwdm.dll", CharSet = CharSet.Auto)]
public static extern int devwdm_StartCaptureMp4(int nID, string strFileName);
[DllImport("devwdm.dll", CharSet = CharSet.Auto)]
public static extern int devwdm_stopCaptureMp4(int nID);
大家帮我看看对不对?来者皆有分啊,越多越好
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 cqjiyong 的回复:]

这种问题反正是麻烦,要折磨死人
[/Quote]
是啊,这周都在找原因,都快崩溃了,我就不信邪了,非得解决了。
之握成 2011-12-29
  • 打赏
  • 举报
回复
这种问题反正是麻烦,要折磨死人
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 biancheng1000 的回复:]

如果自己调试很费劲的话,你可以跟摄像机硬件那边要点例子源码吧,如果没例子是很难受的。就是没有的话也应该有EXE调用的例子吧。还有就是坚持摄像机的型号,跟你用DLL是否吻合的。还有就是检查DLL的文档,没准也可能出问题的。我就遇到过,人家写的DLL文档说明写错了。如果这个函数没问题的话,那就仔细的找找其他方面的问题。
[/Quote]
正在进行中,至今还未找到,谢谢提醒,
biancheng1000 2011-12-29
  • 打赏
  • 举报
回复
如果自己调试很费劲的话,你可以跟摄像机硬件那边要点例子源码吧,如果没例子是很难受的。就是没有的话也应该有EXE调用的例子吧。还有就是坚持摄像机的型号,跟你用DLL是否吻合的。还有就是检查DLL的文档,没准也可能出问题的。我就遇到过,人家写的DLL文档说明写错了。如果这个函数没问题的话,那就仔细的找找其他方面的问题。
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
对了,昨天在网上下了Vcap2820 sdk
有个头文件,这样定义的

#ifndef _DEVWDM_H
#define _DEVWDM_H
#endif

typedef enum
{
AnalogVideo_None = 0x00000000,
AnalogVideo_NTSC_M = 0x00000001,
AnalogVideo_PAL_B = 0x00000010,
AnalogVideo_PAL_D = 0x00000020,
AnalogVideo_SECAM_B = 0x00001000,
AnalogVideo_SECAM_D = 0x00002000,

} AnalogVideoStandard;

/*devwdm_InitCard
函数功能: 初始化设备
nID: 设备ID号,默认0
hWnd: 显示视频窗口的窗口句柄
nWidth, nHeight: 图像的分辨率
*/
LONG APIENTRY devwdm_InitCard(int nID, HWND hWnd, int nWidth, int nHeight);
/*devwdm_CloseCard:
函数功能: 关闭设备
nID: 设备ID号
*/
LONG APIENTRY devwdm_CloseCard(int nID);

/*devwdm_SetVideoStandard
函数功能: 设置视频制式
nID: 设备ID号
VideoStandard: 制式,如P制:AnalogVideo_PAL_D;N制:AnalogVideo_NTSC_M等
*/
LONG APIENTRY devwdm_SetVideoStandard(int nID, LONG VideoStandard);


/*devwdm_SaveBmpFile
函数功能: 保存单前单帧图像
nID: 设备ID号
strFileName: 存放bmp文件的完整路径名
*/
LONG APIENTRY devwdm_SaveBmpFile(int nID, char* strFileName);


/*devwdm_SetDisplayPos
函数功能: 调整视频在其视频窗口的显示位置
nID: 设备ID号
x: 左上角的x位置
y: 左上角的y位置
w: 图像的宽度
h: 图像的高度
*/
LONG APIENTRY devwdm_SetDisplayPos(int nID, int x, int y, int w, int h);


/*devwdm_SetBrightNess,devwdm_SetContrast, devwdm_SetSaturation ,devwdm_SetHue
函数功能: 调整视频的颜色值,分别为亮度,对比度,饱和度色度
nID: 设备ID号
*/
LONG APIENTRY devwdm_SetBrightNess(int nID, LONG brightness);
LONG APIENTRY devwdm_SetContrast(int nID, LONG contrast);
LONG APIENTRY devwdm_SetSaturation(int nID, LONG satu);
LONG APIENTRY devwdm_SetHue(int nID, LONG hue);

/*devwdm_GetBrightNess,devwdm_GetContrast, devwdm_GetSaturation ,devwdm_GetHue
函数功能: 取得当前视频的颜色值,分别为亮度,对比度,饱和度色度
nID: 设备ID号
Min---Max: 色彩范围值
*/
LONG APIENTRY devwdm_GetBrightNess(int nID, LONG *brightness, LONG *Max, LONG *Min, LONG *Default);
LONG APIENTRY devwdm_GetContrast(int nID, LONG *contrast, LONG *Max, LONG *Min, LONG *Default);
LONG APIENTRY devwdm_GetSaturation(int nID, LONG *satu, LONG *Max, LONG *Min, LONG *Default);
LONG APIENTRY devwdm_GetHue(int nID, LONG *hue, LONG *Max, LONG *Min, LONG *Default);


/*devwdm_GetVideoPinCounts
函数功能: 取得当前设备的输入源,如:s-video, 复合视频等
nID: 设备ID号
OutputPins:
InputPins 暂时不用
*/
LONG APIENTRY devwdm_GetVideoPinCounts(int nID, LONG *OutputPins, LONG *InputPins);

/*devwdm_RouteOutPin
函数功能: 设置当前设备的输入源,
nID: 设备ID号
OutputPins: s-video为0, 复合视频为1

*/
LONG APIENTRY devwdm_RouteOutPin(int nID, LONG OutputPin);


/*devwdm_StartVideoPreview
函数功能: 启动视频
nID: 设备ID号

*/
LONG APIENTRY devwdm_StartVideoPreview(int nID);


/*devwdm_SetFlip
函数功能: 将视频图像垂直翻转180度,
nID: 设备ID号
dwFlip: 为DWORD的指针,1或0, 1表示翻转,0表示正常显示
fbGet: 1:此函数当Get使用, 0,此函数当Set使用
*/

LONG APIENTRY devwdm_SetFlip(int nID, DWORD *dwFlip, BOOL fbGet);


/*devwdm_SetMirror
函数功能: 将视频图水平翻转180度,
nID: 设备ID号
dwFlip: 为DWORD的指针,1或0, 1表示翻转,0表示正常显示
fbGet: 1:此函数当Get使用, 0,此函数当Set使用
*/
LONG APIENTRY devwdm_SetMirror(int nID, DWORD *dwMirror, BOOL fbGet);


/*devwdm_PreviewPause
函数功能: 视频暂停显示,
nID: 设备ID号
*/
LONG APIENTRY devwdm_PreviewPause(int nID);

/*devwdm_PreviewResume
函数功能: 重新启动视频显示,与devwdm_PreviewPause相对应
nID: 设备ID号
*/
LONG APIENTRY devwdm_PreviewResume(int nID);

/*devwdm_StartCaptureMp4
函数功能: 启动录像,进行动态采集
nID: 设备ID号
strFileName: 存放录像文件的完整路径名
*/
LONG APIENTRY devwdm_StartCaptureMp4(int nID, char* strFileName);
/*devwdm_stopCaptureMp4
函数功能: 停止录像,终止进行动态采集
nID: 设备ID号
*/
LONG APIENTRY devwdm_stopCaptureMp4(int nID);
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sdl2005lyx 的回复:]

这种问题,确实比较头疼,lz,不知你是否熟悉VC,
可以的话,建议用先用Vc写程序调试。。。
[/Quote]
不是很熟悉,我昨天试了,貌似可以原因不知道,悲剧的很,今天再试试,晕
sdl2005lyx 2011-12-29
  • 打赏
  • 举报
回复
这种问题,确实比较头疼,lz,不知你是否熟悉VC,
可以的话,建议用先用Vc写程序调试。。。
EnForGrass 2011-12-29
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 liyangfd 的回复:]

LONG APIENTRY devwdm_StartCaptureMp4(int nID, char* strFileName);



[DllImport("devwdm.dll", CharSet = CharSet.Ansi)]
public static extern LONG devwdm_StartCaptureMp4(int nID, string strFileNa……
[/Quote]
试了一下,还是这个问题,图如下
足球中国 2011-12-28
  • 打赏
  • 举报
回复
有start就会有end找对应的end方法关闭句柄之类的。问题能解决。
xiaobaitu133 2011-12-28
  • 打赏
  • 举报
回复
不好判断
biancheng1000 2011-12-28
  • 打赏
  • 举报
回复
是你录像的函数调用出问题了吧,内存对齐?声明的缓存空间不够?内存访问越界?
sdl2005lyx 2011-12-28
  • 打赏
  • 举报
回复
那你这样尝试:

你把工程属性:调试-》勾上“启用非托管代码调试”,

F11直接根据C++的代码,单步调试,查看是那句代码出错!
EnForGrass 2011-12-28
  • 打赏
  • 举报
回复
没得问题也、
sdl2005lyx 2011-12-28
  • 打赏
  • 举报
回复
“我用winform 重新写了个也是了,一样的问题。另外,我觉得应该不是函数的问题,有可能是资源释放的问题”

所以,我要你用VC些程序测试啊,在C#这边很难看出来。。。
加载更多回复(10)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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