aardio调用海康DLL开发包显示摄像头画面的一些问题
By
itusers
at 2022-12-19 • 0人收藏 • 3310人看过
现在一
设备网络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();
15 个回复 | 最后更新于 2024-12-11
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
那个代码链接有问题重新传到百度网盘上