开发语言java
把海康威视 ISUP SDK linux demo的部分代码移到自己的项目里了
但在走到预览监听的时候,判断成功后没有进new FPREVIEW_NEWLINK_CB中,包括FPREVIEW_NEWLINK_CB预览数据回调参数也没有进去
在日志里没有看到函数里的打印输出,想知道这是怎么回事,有没有什么解决方法
public void startRealPlayListen() {
//预览监听
if (fPREVIEW_NEWLINK_CB == null) {
fPREVIEW_NEWLINK_CB = new FPREVIEW_NEWLINK_CB();
}
System.arraycopy(propertiesUtil.readValue("SmsServerListenIP").getBytes(), 0, struPreviewListen.struIPAdress.szIP, 0, propertiesUtil.readValue("SmsServerListenIP").length());
struPreviewListen.struIPAdress.wPort = Short.parseShort(propertiesUtil.readValue("SmsServerListenPort")); //流媒体服务器监听端口
struPreviewListen.fnNewLinkCB = fPREVIEW_NEWLINK_CB; //预览连接请求回调函数
struPreviewListen.pUser = null;
struPreviewListen.byLinkMode = 1; //0- TCP方式,1- UDP方式
struPreviewListen.write();
if (StreamHandle < 0) {
StreamHandle = hCEhomeStream.NET_ESTREAM_StartListenPreview(struPreviewListen);
if (StreamHandle == -1) {
System.out.println("NET_ESTREAM_StartListenPreview failed, error code:" + hCEhomeStream.NET_ESTREAM_GetLastError());
hCEhomeStream.NET_ESTREAM_Fini();
return;
} else {
String StreamListenInfo = new String(struPreviewListen.struIPAdress.szIP).trim() + "_" + struPreviewListen.struIPAdress.wPort;
System.out.println("流媒体服务:" + StreamListenInfo + ",NET_ESTREAM_StartListenPreview succeed");
}
}
}
FPREVIEW_NEWLINK_CB代码如下:
public class FPREVIEW_NEWLINK_CB implements HCISUPStream.PREVIEW_NEWLINK_CB {
@Override
public boolean invoke(int lLinkHandle, HCISUPStream.NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData) {
System.out.println("FPREVIEW_NEWLINK_CB callback");
log.info("FPREVIEW_NEWLINK_CB callback");
//预览数据回调参数
lPreviewHandle = lLinkHandle;
HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM struDataCB = new HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM();
if (fPREVIEW_DATA_CB == null) {
fPREVIEW_DATA_CB = new FPREVIEW_DATA_CB();
}
struDataCB.fnPreviewDataCB = fPREVIEW_DATA_CB;
if (!hCEhomeStream.NET_ESTREAM_SetPreviewDataCB(lLinkHandle, struDataCB)) {
System.out.println("NET_ESTREAM_SetPreviewDataCB failed err::" + hCEhomeStream.NET_ESTREAM_GetLastError());
return false;
}
return true;
}
}
调用的HCISUPStream.PREVIEW_NEWLINK_CB
public interface PREVIEW_NEWLINK_CB extends Callback {
public boolean invoke(int lLinkHandle, NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData);
}
fPREVIEW_NEWLINK_CB 里没有构造函数,所以new了什么代码也不执行,只是创建了一个对象
而invoke要调用的时候才会执行呀
我不知道具体你这里是注册了个什么事件
我们之前用海康自动识别车牌功能的摄像头的时候,是识别到车牌就会自动调用回调函数
你应该先确定这个事件触发了没有
if (fPREVIEW_NEWLINK_CB == null) 这一个是字符串空""还是null,这个,这个可以debug调试一下比较准确
你全局找下代码fn_NewLinkCb是在哪里被调用的,这里应该是没有被调用,更不用说进入到你的invoke了,所以你debug也好,加日志也好要在被调用之前看下触发条件,找出未触发的原因,
另外你的监听事件是否注册,如果没注册 你的回调也没办法触发
最主要的是我怀疑你这里的代码有问题:
StreamHandle 初始值是不是0,如果你初始化是0,相当于监听事件是不会触发的,这块的逻辑你得打个日志或者debug,看下是否真的启动监听了
该回答引用于gpt与OKX安生共同编写:
你的问题可能与回调函数的使用有关。建议检查一下回调函数的使用是否正确,并且确保回调函数定义的参数和回调函数调用时传递的参数类型相同。同时,确保回调函数正确注册并有权利对相关事件做出响应。如果问题依然存在,建议查看日志文件以获取更多信息,或者尝试使用调试器调试程序以排除问题。
FPREVIEW_NEWLINK_CB 是你自己定义的class,里面有些构造方法吗,我看你贴的代码没有,所以走到预览监听的时候,判断成功后没有进new FPREVIEW_NEWLINK_CB中是正常的。没有进入预览回调方法,那就说明没有设备的连接初始化没有成功
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以尝试以下几种解决方法:
确认SDK是否正确导入,以及是否与系统内部部分库的版本不兼容。
确认函数调用参数是否正确传递和初始化。
检查预览连接请求回调函数的触发条件,是否满足预期的场景或流程。
添加日志输出,对关键变量或函数的执行结果进行跟踪,帮助定位问题所在。
以下提供一个针对问题可能出现的调试代码,可供参考:
public void startRealPlayListen() {
if (fPREVIEW_NEWLINK_CB == null) {
fPREVIEW_NEWLINK_CB = new FPREVIEW_NEWLINK_CB();
}
System.arraycopy(propertiesUtil.readValue("SmsServerListenIP").getBytes(), 0, struPreviewListen.struIPAdress.szIP, 0, propertiesUtil.readValue("SmsServerListenIP").length());
struPreviewListen.struIPAdress.wPort = Short.parseShort(propertiesUtil.readValue("SmsServerListenPort"));
struPreviewListen.fnNewLinkCB = fPREVIEW_NEWLINK_CB;
struPreviewListen.pUser = null;
struPreviewListen.byLinkMode = 1;
struPreviewListen.write();
if (StreamHandle < 0) {
StreamHandle = hCEhomeStream.NET_ESTREAM_StartListenPreview(struPreviewListen);
if (StreamHandle == -1) {
System.out.println("NET_ESTREAM_StartListenPreview failed, error code:" + hCEhomeStream.NET_ESTREAM_GetLastError());
hCEhomeStream.NET_ESTREAM_Fini();
return;
} else {
String StreamListenInfo = new String(struPreviewListen.struIPAdress.szIP).trim() + "_" + struPreviewListen.struIPAdress.wPort;
System.out.println("流媒体服务:" + StreamListenInfo + ",NET_ESTREAM_StartListenPreview succeed");
}
}
}
// check if the callback function throws trigger
public boolean invoke(int lLinkHandle, NET_EHOME_NEWLINK_CB_MSG pNewLinkCBMsg, Pointer pUserData) {
System.out.println("FPREVIEW_NEWLINK_CB callback");
log.info("FPREVIEW_NEWLINK_CB callback");
lPreviewHandle = lLinkHandle;
System.out.println("lLinkHandle: " + lLinkHandle);
System.out.println("pNewLinkCBMsg.dwCmdType: " + pNewLinkCBMsg.dwCmdType);
System.out.println("pNewLinkCBMsg.byRes1: " + pNewLinkCBMsg.byRes1);
System.out.println("pNewLinkCBMsg.byRes2: " + pNewLinkCBMsg.byRes2);
System.out.println("pNewLinkCBMsg.struLinkInfo.dwIP: " + pNewLinkCBMsg.struLinkInfo.dwIP);
System.out.println("pNewLinkCBMsg.struLinkInfo.wPort: " + pNewLinkCBMsg.struLinkInfo.wPort);
HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM struDataCB = new HCISUPStream.NET_EHOME_PREVIEW_DATA_CB_PARAM();
if (fPREVIEW_DATA_CB == null) {
fPREVIEW_DATA_CB = new FPREVIEW_DATA_CB();
}
struDataCB.fnPreviewDataCB = fPREVIEW_DATA_CB;
if(!hCEhomeStream.NET_ESTREAM_SetPreviewDataCB(lLinkHandle, struDataCB)){
System.out.println("NET_ESTREAM_SetPreviewDataCB failed err::" + hCEhomeStream.NET_ESTREAM_GetLastError());
return false;
}
return true;
}
建议采用以上方法进行定位和调试,希望能解决你的问题。
如果我的回答解决了您的问题,请采纳!