Qt海康二次开发实时预览求助

小青年的春天 2016-12-02 11:11:02
环境ubuntu10.04+Qt4.7.3+海康SDK for linux(32位)

我按照@JIYIHANXINGQUAN网友的主体程序,自己进行修改,得到想要的功能。在此谢过这位网友了。

下面说我的问题,编译通过,生成可执行文件,运行程序,都可以,可是点击按钮之后,就会闪退,不知道什么原因,大牛给支支招,给点思路,自己一个人闷头苦想很难受啊。

具体功能,实现实时预览的功能.所以就新建了一个基于widget的类,有一个QFrame和一个QPushButton.当点击QPushButton后,开始登录摄像头,进行实时预览的操作.但是每当运行程序,点击按钮后就闪退,不能实时预览画面,当我加入抓图功能函数时,可以进行抓图,不知道有什么解决思路。还有海康给的Demo我也没有调试成功。

下面附上我的代码:
SDK_read.h

#ifndef SDK_READ_H
#define SDK_READ_H

#include <QtGui>

class sdk_read: public QWidget
{
Q_OBJECT

public:
sdk_read();

private slots:
void push_button();

private:
QFrame *frame;
QPushButton *button;

};
#endif // SDK_READ_H



SDK_read.cpp

#include <sdk_read.h>
#include <LinuxPlayM4.h>
#include <PlayM4.h>
#include <HCNetSDK.h>
#include <QtGui>

typedef unsigned int HWND;
static bool play=false;
static LONG lUserID=0;

sdk_read::sdk_read()
{
button=new QPushButton(tr("Clicked Me"),this);
button->show();
connect(button,SIGNAL(clicked()),this,SLOT(push_button()));

frame=new QFrame(this);
frame->setFrameShape(QFrame::StyledPanel);
frame->setFrameShadow(QFrame::Raised);
frame->show();

QVBoxLayout *mainlayout=new QVBoxLayout;
mainlayout->addWidget(frame);
mainlayout->addWidget(button);

setLayout(mainlayout);
setWindowTitle(tr("SDK"));

}

void sdk_read::push_button()
{
LONG lRealHandle=0;

if(play)
{
NET_DVR_StopRealPlay(lRealHandle);
NET_DVR_Logout_V30(lUserID);
lRealHandle=0;
lUserID=0;
//NET_DVR_Cleanup();
play=false;
qDebug("Log out");
}

else
{
NET_DVR_Init();
//NET_DVR_SetConnectTime(2000, 1);
//NET_DVR_SetReconnect(10000, true);
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
memset(&struDeviceInfo,0,sizeof(NET_DVR_DEVICEINFO_V30));
lUserID=NET_DVR_Login_V30("202.118.13.87",8000,"admin","hikvision123",&struDeviceInfo);
if(lUserID<0)
{
qDebug("Login error,%d/n",NET_DVR_GetLastError());
NET_DVR_Cleanup();
}

NET_DVR_SetLogToFile(3,"/home/sdklog/",TRUE);
NET_DVR_CLIENTINFO tmpclientinfo;
tmpclientinfo.hPlayWnd=(HWND)frame->winId();
tmpclientinfo.lChannel=1;
tmpclientinfo.lLinkMode=0;
tmpclientinfo.sMultiCastIP = NULL;

//NET_DVR_PREVIEWINFO tmpclientinfo;
//tmpclientinfo.hPlayWnd=(HWND)frame->winId();
//tmpclientinfo.lChannel=1;
//tmpclientinfo.dwStreamType=0;
//tmpclientinfo.dwLinkMode=0;

lRealHandle=NET_DVR_RealPlay_V30(lUserID,&tmpclientinfo,NULL,NULL,0);
NET_DVR_SetCapturePictureMode(0);
NET_DVR_CapturePicture(lRealHandle,"/home/realarm/5.bmp");

qDebug("Demo---Protocal:%d",tmpclientinfo.lLinkMode);
qDebug("Demo---lChannel:%d",tmpclientinfo.lChannel);
qDebug("Demo---lRealHandle:%d",lRealHandle);

if(lRealHandle<0)
{
QMessageBox::information(this,tr("NET_DVR_RealPlay error"),tr("SDK_LAST ERROR=%1").arg(NET_DVR_GetLastError()));
NET_DVR_Logout_V30(lUserID);
}
if(lRealHandle>0)
{
play=true;
qDebug("Play=true");
}
}
}


来个大牛给点思路啊。


...全文
783 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
小青年的春天 2016-12-02
  • 打赏
  • 举报
回复
附上网友JIYIHANXINGQUAN 的那篇帖子 http://bbs.csdn.net/topics/391079293
小青年的春天 2016-12-02
  • 打赏
  • 举报
回复
首先,程序是点击之后闪退,还有我用的是Qt Creator, 显示的日志文件,我觉得没问题,应该是访问成功了,抓图函数可以成功实现,就是点击按钮后窗口闪退,不能实时预览。 [2016-12-02 16:56:07.719][INF] The COM:Preview ver is 5.0.3.4, 2015_01_14. [2016-12-02 16:56:07.751][INF] ID-IP-CHAN[0-202.118.13.87-1] [CPreviewSession::AdjustProtoType] StreamMode[0], StreamProtocol[0xffff] [2016-12-02 16:56:12.838][INF] GlobalCtrl load [libPlayCtrl.so] with sdk path success and get handle[0xb7728000] [2016-12-02 16:56:12.838][DBG] ID-IP-CHAN[0-202.118.13.87-1] [CPreviewPlayer::CreatePlayer] create player success, version is[v7.0.3.4] [2016-12-02 16:56:12.839][DBG] ID-IP-CHAN[0-202.118.13.87-1] [CPreviewSession::Start] SUCC [2016-12-02 16:56:12.842][INF] Private connect 202.118.13.87:8000 sock=14 this=0xb6c6000c cmd=0x30000 port=38968 Demo---Protocal:0 Demo---lChannel:1 Demo---lRealHandle:0 [2016-12-02 16:56:13.426][INF] ID-IP-CHAN[0-202.118.13.87-1] [CPreviewPlayer::OpenPlayer] open player[9526fd4] success The program has unexpectedly finished. /home/realarm/SDK_read/SDK_read/SDK_read exited with code 0
赵4老师 2016-12-02
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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