基于QT的华为网络摄像头二次开发

资源下载链接

第一次使用华为的网络摄像头并进行二次开发,网上关于QT对华为网络摄像头的二次开发的文章很少,基于项目的需求做了一些工作,特此记录。

目标:

1、实时预览

2、手动控制录制视频

3、监听告警信号

4、实时获取元数据中的划定区域内的人数

摄像头型号如下:

准备工作:

在购买摄像头后,应当在官网下载对应的开发资料,如果需要权限,则联系华为的技术支持人员。下载资料如下:

SDC Development Kit Demo 8.0.T9 SDK DEMO下载地址:https://bbs.huaweicloud.com/forum/thread-76061-1-1.html

SDC Development Kit 8.0.RC3 下载地址:https://bbs.huaweicloud.com/forum/thread-76255-1-1.html

智能摄像机SDK相关FAQ集:https://bbs.huaweicloud.com/forum/thread-28015-1-1.html?mobile=2Q57

在sdk目录下有对应的开发指南,根据开发指南进行环境搭建、流程搭建、函数查找等

代码分析:

/*********************告警回调函数,此处用于监听人数超限告警***********************/
long CALLBACK fGetAlarmInfoCallBack(LPPU_ALARM_REPORT_S pstAlarmReport , void *pUsrData)
{
    PU_ITGT_CROWD_DENSITY_DETECT_PARAM_S *crowdDensityWarning;
    //选择人群密度告警
    switch(pstAlarmReport-> enAlarmType)
    {
        case PU_ALARM_TYPE_CROWD_DENSITY_DETECT:
            //crowdDensityWarning = qobject_cast<PU_ITGT_CROWD_DENSITY_DETECT_PARAM_S *>(pUsrData);
            break;
        default:
            break;
    }

    printf("Device Id:%d\tAlarm type:%d\ttime:%s-%s-%s % s:%s:%s\tAlarm happen:%d\n", pstAlarmReport->ulDeviceId, pstAlarmReport-> enAlarmType,
    pstAlarmReport->stTime.szYear, pstAlarmReport->stTime.szMonth, pstAlarmReport->stTime.szDay, pstAlarmReport->stTime.szHour,
    pstAlarmReport->stTime.szMinute,  pstAlarmReport->stTime.szSecond, pstAlarmReport->enAction);

    return 0;
}
/*****************回调函数,此处用于获取元数据中划定区域的人数*********************/
void CALLBACK fRealDataCallBack(CHAR *szBuffer, LONG lSize, VOID *pUsrData)
{
    BOOL bRet = PU_FALSE;
    //第二层元数据TYPE : TARGET //目标(车、人、人脸等)
    PU_META_DATA *pstMetaTargetData = NULL;
    bRet = IVS_User_GetMetaData(szBuffer,lSize,TARGET, &pstMetaTargetData);
    if ((PU_TRUE == bRet) && (NULL != pstMetaTargetData))
    {
        procMetaData(pstMetaTargetData);
        IVS_User_FreeMetaData(&pstMetaTargetData);
    }
    return;
}
//初始化SDK
void camerawidget::InitSDK()
{
    bool isInit = IVS_PU_Init(3 , NULL , 5050);
    if(!isInit)
    {
        long RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1,错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        return;
    }
}

//注册设备
void camerawidget::DeviceLogin()
{
    QString m_IP = "192.168.0.14";
    ULONG strPort = 6060;
    QString strUser = "admin";
    QString strPwd = "HuaWei123";

    m_lUserID = IVS_PU_Login(m_IP.toLatin1().data() , strPort , strUser.toLatin1().data() , strPwd.toLatin1().data());
    if(PU_FALSE == m_lUserID)
    {
        long RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1,错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        return;
    }

    //设置断网重连
    if(PU_FALSE == IVS_PU_SetAutoReconnect(1))
    {
        long RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1,错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        return;
    }
}

 

/********************Part1: 实时获取区域人数****************/
void camerawidget::startPreview_callbackPeoploNum()
{
    PU_REAL_PLAY_INFO_S stRealPlayInfo = {0};
    stRealPlayInfo.ulChannelId = 101;               //通道号
    stRealPlayInfo.bKeepLive = TRUE;            //是否报活
    stRealPlayInfo.enStreamType = PU_VIDEO_MAIN_STREAM;             //码流类型
    stRealPlayInfo.enVideoType = PU_VIDEO_TYPE_META;      //流类型
    stRealPlayInfo.enProtocolType = PU_PROTOCOL_TYPE_TCP;           //传输协议类型
    stRealPlayInfo.enMediaCallbackType = PU_MEDIA_CALLBACK_TYPE_META_FRAME;
    stRealPlayInfo.enMediaCryptoType = PU_MEDIA_CRYPTO_NONE;    //不加密
    stRealPlayInfo.szReserved[22] = 1;
    stRealPlayInfo.hPlayWnd = NULL;

    m_ReculVideoPlayhandle = IVS_PU_RealPlay(m_lUserID, &stRealPlayInfo, fRealDataCallBack , NULL);
    if(PU_FALSE == m_ReculVideoPlayhandle)
    {
        ULONG RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1 , 错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        //如果错误,则定时重连
        callbackPeoploNumConnectFlag = false;
        return;
    }
    else
    {
        callbackPeoploNumConnectFlag = true;
    }

    //告警
 /*   if(PU_FALSE == IVS_PU_AlarmInfoStatesCallBack(m_lUserID,  fGetAlarmInfoCallBack , NULL))
    {
        long RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1,错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        return;
    }*/
}
/*********************Part2 :录像部分*********************/
void camerawidget::startPreview_saveRealData()       //预览,并用于录像
{
    PU_REAL_PLAY_INFO_S stRealPlayInfo = {0};

    stRealPlayInfo.ulChannelId = 101;               //通道号
    stRealPlayInfo.bKeepLive = TRUE;            //是否报活
    stRealPlayInfo.enStreamType = PU_VIDEO_MAIN_STREAM;             //码流类型
    stRealPlayInfo.enVideoType = PU_VIDEO_TYPE_VIDEO;      //流类型
    stRealPlayInfo.enProtocolType = PU_PROTOCOL_TYPE_TCP;           //传输协议类型
    stRealPlayInfo.enMediaCallbackType = PU_MEDIA_CALLBACK_TYPE_RTP;
    stRealPlayInfo.enMediaCryptoType = PU_MEDIA_CRYPTO_NONE;    //不加密
    stRealPlayInfo.hPlayWnd =  (HWND)ui->label->winId();

    if(NULL == stRealPlayInfo.hPlayWnd)
    {
        QMessageBox::about(NULL , "提示" , "获取句柄失败");
        return;
    }

    m_recordingPreviewHandle = IVS_PU_RealPlay(m_lUserID, &stRealPlayInfo, NULL , NULL);
    if(PU_FALSE == m_recordingPreviewHandle)
    {
        ULONG RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "提示" , QString("错误码是%1 , 错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        saveRealDataConnectFlag = false;
        return;
    }
    else
    {
        saveRealDataConnectFlag = true;
    }
}
//开始保存录像数据
void camerawidget::startSaveRealData(QString path)
{
    //保存实况数据
    PU_SAVE_REALDATA_INFO_S saveRealDataInfo = {0};
    //memset(saveRealDataInfo, 0, sizeof(LPPU_SAVE_REALDATA_INFO_S));
    saveRealDataInfo.enSaveType = PU_SAVE_REALDATA_TYPE_TIME;
    strcpy(saveRealDataInfo.szFilePath , path.toLatin1().data());
    saveRealDataInfo.ulSaveSize = 1440;          //最大大小,才能正常播放(时间单位:分钟,大小单位:Mb),此处设置为一天

    if(PU_FALSE == IVS_PU_SaveRealData(m_lUserID , m_recordingPreviewHandle, &saveRealDataInfo))
    {
        ULONG RetErro=IVS_PU_GetLastError();
        QMessageBox::about(NULL , "开始录像" , QString("错误码是%1 , 错误信息是%2").arg(RetErro).arg(IVS_PU_GetErrorMsg(RetErro)));
        return;
    }
}

注意事项:

1、windows下64位sdk加载有问题,请参考:

2、网页登录摄像头与通过SDK登录摄像头的密码是独立的;SDK固定的账户名和密码:admin/HuaWei123,固定端口是6060

3、视频显示和码流回调不能同时进行,需两次调用接口即可

4、录像时,开始录像函数与停止录像函数必须成对使用,否则视频会无法渲染

 

资源下载链接

 

欢迎大家指教,希望大家喜欢

路漫漫其修远兮,同志仍须努力

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要连接华为云数据库,你需要使用Qt提供的QtSql模块。QtSql模块提供了一种通用的接口来访问各种关系数据库,包括MySQL、SQLite、PostgreSQL和ODBC等。 下面是连接华为云数据库的一些步骤: 1. 在华为云上创建一个数据库实例,并且开启公网IP。 2. 在Qt中创建一个新的Qt控制台应用程序。 3. 在Qt Creator中,添加一个新的QtSql项目,然后选择数据库类型为MySQL。 4. 在Qt Creator中,打开工具->选项->Qt Versions,选择Qt版本,并设置正确的Qt路径。 5. 在Qt Creator中,打开工具->选项->Kits,选择一个合适的套件,并设置正确的工具链和Qt版本。 6. 在Qt Creator中,打开项目的.pro文件,添加以下代码: ``` QT += sql ``` 7. 在Qt Creator中,打开项目的.pro文件,添加以下代码: ``` INCLUDEPATH += /path/to/mysql-connector-c/include LIBS += -L/path/to/mysql-connector-c/lib -lmysqlclient ``` 其中,/path/to/mysql-connector-c是你安装MySQL的路径。 8. 在Qt Creator中,打开项目的.pro文件,添加以下代码: ``` DB_HOST = your_host DB_NAME = your_database_name DB_USER = your_username DB_PASS = your_password QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName(DB_HOST); db.setDatabaseName(DB_NAME); db.setUserName(DB_USER); db.setPassword(DB_PASS); if (db.open()) { // 数据库连接成功 } else { // 数据库连接失败 } ``` 其中,your_host是你的数据库实例的公网IP地址,your_database_name是你的数据库名称,your_username是你的数据库用户名,your_password是你的数据库密码。 这样,在你的Qt控制台应用程序中,你就可以连接到华为云数据库了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xumingyifrend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值