aardio调用海康DLL开发包显示摄像头画面的一些问题
By
itusers
at 2022-12-19 • 0人收藏 • 2481人看过
现在一
设备网络SDK编程指南(IPC).pdf海康开发手册。aardio代码链接如下http://itusers.f3322.org:8080/hk.zip
连接就出现这种错误,海康摄像头我已经放到公网上了全天24小时在线,大哥们帮忙看看代码的错误。
import win.ui; /*DSG{{*/ mainForm = win.form(text="海康";right=757;bottom=467) mainForm.add( button={cls="button";text="连接";left=432;top=408;right=536;bottom=448;z=2}; button2={cls="button";text="断开";left=608;top=408;right=712;bottom=440;z=3}; custom={cls="custom";text="自定义控件";left=24;top=16;right=728;bottom=304;z=1} ) /*}}*/ import console; import raw; import win; function link(){ Dll = raw.loadDll("~/res/HCNetSDK.dll"); // 初始化 Dll.NET_DVR_Init(); //设置连接时间与重连时间 Dll.NET_DVR_SetConnectTime(2000, 1); Dll.NET_DVR_SetReconnect(10000, true); HWND = mainForm.custom.hwnd; class NET_DVR_DEVICEINFO_V30{ } stru = NET_DVR_DEVICEINFO_V30(); lUserID = Dll.NET_DVR_Login_V30("42.230.192.110", 8000, "a", "hk123456", stru);//IP地址,端口,账号,密码,结构体 if(lUserID != 0){ win.msgbox("错误:" + Dll.NET_DVR_GetLastError()); Dll.NET_DVR_Cleanup(); return; } NET_DVR_RealPlay_V40 = Dll.api("NET_DVR_RealPlay_V40","void(struct& NET_DVR_PREVIEWINFO)" ); class NET_DVR_PREVIEWINFO{ LONG lChannel = 1; DWORD dwStreamType = 0; DWORD dwLinkMode = 0; HWND hPlayWnd; BOOL bBlocked = 1; _struct_aligned = 1; } struPlayInfo = NET_DVR_PREVIEWINFO(); struPlayInfo.hPlayWnd = HWND; //console.varDump(struPlayInfo.hPlayWnd); lRealPlayHandle = Dll.NET_DVR_RealPlay_V40(lUserID, struPlayInfo,null ,null ); if (lRealPlayHandle < 0){ win.msgbox("错误:" + Dll.NET_DVR_GetLastError()); Dll.NET_DVR_Logout(lUserID); dLL.NET_DVR_Cleanup(); return; } } function stop(){ //关闭预览 Dll.NET_DVR_StopRealPlay(lRealPlayHandle); //注销用户 Dll.NET_DVR_Logout(lUserID); //释放 SDK 资源 Dll.NET_DVR_Cleanup(); console.varDump(lUserID); } mainForm.button.oncommand = function(id,event){ link();//海康连接函数 } mainForm.button2.oncommand = function(id,event){ stop();//海康登陆销毁退出 } mainForm.show(); return win.loopMessage();
14 个回复 | 最后更新于 2023-11-14
2022-12-20
#2
这样写结构体,放到 C# 里只会错得更厉害。
aardio 已经提示你 struct 语法错误了,你这个结构体转换为 aardio 应该是:
class NET_DVR_PREVIEWINFO{ int lChannel = 1; INT dwStreamType; INT dwLinkMode; addr hPlayWnd; int bBlocked = 1; }
aardio 的静态类型比 C++、C# 要简单得多。
例如 int 就是 32 位整数,大写 INT 就表示无符号。
不像 C++ 同一类型有成千上万的别名。
API 编程本来就难,
aardio 虽然不用像 C++、C# 那样需要几年的学习才能干活。
但至少先了解一下基础数据类型吧?看你都在这里等别人帮忙等了好几天了,去看下基础数据类型就几分钟的事。
代码很简单:
import win.ui; var winform = win.form(text="调用海康 DLL"); winform.show(); var hk = raw.loadDll("\hk\HCNetSDK.dll"); hk.NET_DVR_Init(); var lUserID = hk.NET_DVR_Login_V30("42.230.192.110", 8000, "a", "hk123456", null);//IP地址,端口,账号,密码,结构体 var previewInfo = { int lChannel = 1; INT dwStreamType; INT dwLinkMode; addr hPlayWnd = winform.hwnd; int bBlocked = 1; int bPassbackRecord; BYTE byPreviewMode; BYTE byStreamID[32]; BYTE byProtoType; BYTE byRes1; BYTE byVideoCodingType; INT dwDisplayBufNum; BYTE byRes[216]; } hk.NET_DVR_RealPlay_V40(lUserID, previewInfo,null,null); win.loopMessage();
NET_DVR_Login_V30 可以省略,
需要的话可以用 “ 工具 / 转换工具 / API 转换工具” 转换一下:
class NET_DVR_DEVICEINFO_V30{ BYTE sSerialNumber[48]; BYTE byAlarmInPortNum; BYTE byAlarmOutPortNum; BYTE byDiskNum; BYTE byDVRType; BYTE byChanNum; BYTE byStartChan; BYTE byAudioChanNum; BYTE byIPChanNum; BYTE byZeroChanNum; BYTE byMainProto; BYTE bySubProto; BYTE bySupport; BYTE bySupport1; BYTE bySupport2; WORD wDevType; BYTE bySupport3; BYTE byMultiStreamProto; BYTE byStartDChan; BYTE byStartDTalkChan; BYTE byHighDChanNum; BYTE bySupport4; BYTE byLanguageType; BYTE byVoiceInChanNum; BYTE byStartVoiceInChanNo; BYTE byRes3[2]; BYTE byMirrorChanNum; WORD wStartMirrorChanNo; BYTE byRes2[2]; }
登录后方可回帖
链接:https://pan.baidu.com/s/13k1nyBPS2pp1u91ep1jWYQ?pwd=velp
提取码:velp
那个代码链接有问题重新传到百度网盘上