萤石摄像头C++SDK应用实例

程序示例精选
萤石摄像头C++SDK应用实例
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对《萤石摄像头C++SDK应用实例》编写代码,代码整洁,规则,易读。 学习与应用推荐首选。


运行结果

文章目录

一、所需工具软件
二、使用步骤
1. 主要代码
2. 运行结果
三、在线协助

一、所需工具软件

1. C++
2. VS

二、使用步骤

代码如下(示例):
cpp 复制代码
#include <QDebug>
#include <QInputDialog>
#include <QTableView>
#include <QTextBrowser>
#include <QMessageBox>
#include <QTimer>
#include <QFileDialog>
#include <QMenu>
#include <fstream>
#include <QLocale>
#include <QDir>
#include <QThread>
#include <map>
#include <time.h>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qcalendarproxy.h"
#include "cameramodel.h"
#include "alarmmodel.h"
#include "pushalarmmodel.h"
#include "recordmodel.h"
#include "localsetting.h"
#include "OpenNetStreamError.h"
#include "gbcameramodel.h"
#include <QtCore/QDateTime>

char *UTF8ToAnsi(const char *szUTF8String)
{
#if defined(_WIN32) || defined(_WIN64)
	WCHAR* strSrc = NULL;
	char* szRes = NULL;
    
	int i = MultiByteToWideChar(CP_UTF8, 0, szUTF8String, -1, NULL, 0);
    
	strSrc = new WCHAR[(size_t)i+1];
	MultiByteToWideChar(CP_UTF8, 0, szUTF8String, -1, strSrc, i);
    
	i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
    
	szRes = new char[(size_t)i+1];
	WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
    
	delete[] strSrc;
	strSrc = NULL;
    
	return szRes;
    
#elif defined(__linux__)
	char *outbuf = 0;
	if (szUTF8String)
	{
		iconv_t cd = iconv_open("EUC-CN", "UTF-8");
		if (cd)
		{
			size_t contlen = strlen(szUTF8String);
			size_t outbuflen = contlen * 3 + 1;
			outbuf = new char[outbuflen];
			memset(outbuf, 0, outbuflen);
            
			char *inptr = const_cast<char*>(szUTF8String);
			char *outptr = outbuf;
            
			size_t inlen = contlen;
			size_t outlen = outbuflen;
			if (iconv(cd, &inptr, &inlen, &outptr, &outlen) == (size_t)(-1))
			{
				outbuf = 0;
			}
            
			iconv_close(cd);
		}
	}
	return outbuf;
#else
    size_t contlen = strlen(szUTF8String);
    size_t outbuflen = contlen;
    char *outbuf = new char[outbuflen];
    if (outbuf)
    {
        memset(outbuf, 0, outbuflen);
        memcpy(outbuf, szUTF8String, outbuflen);
    }

    return outbuf;
#endif
}

std::string UTF8ToANSIString(const char *pUtf8String)
{
    std::string strANSI;
	if (pUtf8String != NULL)
	{
		char *pAnsi = UTF8ToAnsi(pUtf8String);
		if (pAnsi != NULL)
		{
			strANSI = pAnsi;
			delete []pAnsi;
		}
	}
	
	return strANSI;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_osdTimer(NULL),
	m_bRealPlayStarted(false),
	m_bPlayBackStarted(false),
	m_bPlayBackFinished(false),
    m_bVideoDownload(false),
    m_bDeviceVideoDownload(false),
    m_bCloudVideoDownload(false),
    m_bP2PDownload(false),
    m_bCloudPlayBack(false),
    m_bMergeDownload(false),
    m_iSuportSeekplayback(0),
    m_iSuportSeek2playback(0),
    m_iStartTime(0),
    m_iEndTime(0),
    m_sliderStop(0),
    m_releasedSeekTime(0),
    m_previousTimestamp(-1),
    m_previousPosition(0),
    m_movedForward(false),
    m_movedBackward(false),
    m_setSliderDisableCount(0),
    m_Seek2StopFlag(0)
{
    ui->setupUi(this);


    // 正确做法
    //resize(800, 600); // 允许窗口调整大小

	LocalSetting::getInstance();
    //User own device list
    m_deviceTableView = new QTableView(this);
    m_deviceTableView->setContextMenuPolicy(Qt::CustomContextMenu);
    m_deviceTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_deviceTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tabWidget->addTab(m_deviceTableView, tr("Device List"));

    connect(m_deviceTableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotDeviceTableViewPressed(const QModelIndex &)));

	if(1 == LocalSetting::getInstance()->GetGbFlag())
	{
		m_gbdDviceTableModel = new GbCameraModel(this);
		m_deviceTableView->setModel(m_gbdDviceTableModel);
	}
	else
	{
		m_deviceTableModel = new CameraModel(this);
		m_deviceTableView->setModel(m_deviceTableModel);
	}
    
    //User shared device list
    m_shareDevTableView = new QTableView(this); 
    m_shareDevTableView->setContextMenuPolicy(Qt::CustomContextMenu);
    m_shareDevTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_shareDevTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tabWidget->addTab(m_shareDevTableView, tr("Share Dev List"));

    connect(m_shareDevTableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotDeviceTableViewPressed(const QModelIndex &)));

    m_shareDevTableModel = new CameraModel(this);
    m_shareDevTableView->setModel(m_shareDevTableModel);

    m_alarmTableView = new QTableView(this);
    m_alarmTableView->setContextMenuPolicy(Qt::CustomContextMenu);
    m_alarmTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_alarmTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tabWidget->addTab(m_alarmTableView, tr("Alarm List"));

    m_alarmTableModel = new AlarmModel(this);
    m_alarmTableView->setModel(m_alarmTableModel);

    m_pushAlarmTableView = new QTableView(this);
    m_pushAlarmTableView->setContextMenuPolicy(Qt::CustomContextMenu);
    m_pushAlarmTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_pushAlarmTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tabWidget->addTab(m_pushAlarmTableView, tr("Push-Alarm-List"));

    m_pushAlarmTableModel = new PushAlarmModel(this);
    m_pushAlarmTableView->setModel(m_pushAlarmTableModel);

    connect(m_pushAlarmTableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotPushAlarmTableViewPressed(const QModelIndex &)));

    m_playBackTableView = new QTableView(this);
    m_playBackTableView->setContextMenuPolicy(Qt::CustomContextMenu);
    m_playBackTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_playBackTableView->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tabWidget->addTab(m_playBackTableView, tr("Playback List"));

    m_playBackTableModel = new RecordModel(this);
    m_playBackTableView->setModel(m_playBackTableModel);

    connect(m_playBackTableView, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slotPlayBackTableViewPressed(const QModelIndex &)));

    m_jsonTextBrowser = new QTextBrowser(this);
    ui->tabWidget->addTab(m_jsonTextBrowser, tr("json"));

    m_realPlayMenu = new QMenu(this);
    ui->switchVideoLevelButton->setMenu(m_realPlayMenu);
    m_SetPlayBackScaleMenu=new QMenu(this);
    ui->SetScaleButton->setMenu(m_SetPlayBackScaleMenu);//add setPlayBackScale botton menu;



	int iSmallPermission = LocalSetting::getInstance()->GetSmallPermission();
	if(0 == iSmallPermission)
	{
		//! [1] init library,alloc session
		OpenNetStream::getInstance()->initLibrary(LocalSetting::getInstance()->authAddress(), LocalSetting::getInstance()->platformAddress(), 
			LocalSetting::getInstance()->appKey(),LocalSetting::getInstance()->Overseas());	
	}
	else if(1 == iSmallPermission)
	{
		//! [1] init library,alloc session
		OpenNetStream::getInstance()->initInitClientLib(LocalSetting::getInstance()->authAddress(), LocalSetting::getInstance()->platformAddress(), 
			LocalSetting::getInstance()->appKey(),LocalSetting::getInstance()->Overseas(),1);	
	}



    QString areaID = LocalSetting::getInstance()->areaId();
    if (!areaID.isEmpty())
    {
        OpenNetStream::getInstance()->setAreaID(areaID);
    }
    QString loginVer = LocalSetting::getInstance()->loginVer();
    if (!loginVer.isEmpty())
    {
        OpenNetStream::getInstance()->setLoginVer(loginVer);
    }
	
	QString logo = LocalSetting::getInstance()->logo();
    if (!logo.isEmpty())
    {
        OpenNetStream::getInstance()->setLogo(logo);
    }

	QString PrivacyPolicy = LocalSetting::getInstance()->PrivacyPolicy();
    if (!PrivacyPolicy.isEmpty())
    {
        OpenNetStream::getInstance()->setPrivacyPolicy(PrivacyPolicy);
    }

	QString ServiceTerms = LocalSetting::getInstance()->ServiceTerms();
    if (!ServiceTerms.isEmpty())
    {
        OpenNetStream::getInstance()->setServiceTerms(ServiceTerms);
    }

    if (LocalSetting::getInstance()->dataUtf8())
    {
        OpenNetStream::getInstance()->setDataUtf8();
    }

    if (LocalSetting::getInstance()->streamTrans())
    {
        OpenNetStream::getInstance()->setStreamTrans();
    }

    //OpenNetStream::getInstance()->setCloseBlongSer();

    //OpenNetStream::getInstance()->setCloseKeyAuth();

    if (LocalSetting::getInstance()->closeP2P())
    {
        OpenNetStream::getInstance()->closeP2P();
    }

	QString LoginauthAddr = LocalSetting::getInstance()->LoginauthAddress();
	if (!LoginauthAddr.isEmpty())
    {
        OpenNetStream::getInstance()->setLoginAuthAddr(LoginauthAddr);
    }
	
    if (LocalSetting::getInstance()->fastStream())
    {
        OpenNetStream::getInstance()->fastStream(1);
    }
    else
    {
        OpenNetStream::getInstance()->fastStream(0);
    }

    int iP2PMaxNum = LocalSetting::getInstance()->P2PMaxNum();
    if (iP2PMaxNum > 0)
    {
        OpenNetStream::getInstance()->setP2PMaxNum(iP2PMaxNum);
    }

    //int iP2PCheckPeriod = LocalSetting::getInstance()->P2PCheckPeriod();
    //if (iP2PCheckPeriod > 0)
    //{
    //    OpenNetStream::getInstance()->setP2PCheckPeriod(iP2PCheckPeriod);
    //}

    //int iP2PExpire = LocalSetting::getInstance()->P2PExpire();
    //if (iP2PExpire > 0)
    //{
    //    OpenNetStream::getInstance()->setP2PExpire(iP2PExpire);
    //}
    int iLogLevel = LocalSetting::getInstance()->logLevel();
    if (iLogLevel > 0)
    {
        OpenNetStream::getInstance()->setLogLevel(iLogLevel);
    }
    
    m_sessionId = OpenNetStream::getInstance()->allocSessionEx(MainWindow::messageHandler, this);
    //! [1]
	int iBlongSerial = LocalSetting::getInstance()->GetBlongSerial();
    OpenNetStream::getInstance()->setSessionCloseBlong(m_sessionId, iBlongSerial);

  

}
运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!

1)远程安装运行环境,代码调试
2)Visual Studio, Qt, C++, Python编程语言入门指导
3)界面美化
4)软件制作
5)云服务器申请
6)网站制作

当前文章连接: https://blog.csdn.net/alicema1111/article/details/132666851
个人博客主页https://blog.csdn.net/alicema1111?type=blog
博主所有文章点这里: https://blog.csdn.net/alicema1111?type=blog

博主推荐:
Python人脸识别考勤打卡系统:
https://blog.csdn.net/alicema1111/article/details/133434445
Python果树水果识别https://blog.csdn.net/alicema1111/article/details/130862842
Python+Yolov8+Deepsort入口人流量统计: https://blog.csdn.net/alicema1111/article/details/130454430
Python+Qt人脸识别门禁管理系统: https://blog.csdn.net/alicema1111/article/details/130353433
Python+Qt指纹录入识别考勤系统: https://blog.csdn.net/alicema1111/article/details/129338432
Python Yolov5火焰烟雾识别源码分享: https://blog.csdn.net/alicema1111/article/details/128420453
Python+Yolov8路面桥梁墙体裂缝识别: https://blog.csdn.net/alicema1111/article/details/133434445
Python+Yolov5道路障碍物识别: https://blog.csdn.net/alicema1111/article/details/129589741
Python+Yolov5跌倒检测 摔倒检测 人物目标行为 人体特征识别: https://blog.csdn.net/alicema1111/article/details/129272048

相关推荐
逾明1 小时前
Electron自定义菜单栏及Mac最大化无效的问题解决
前端·electron
洛阳泰山1 小时前
基于 Easy Rules 的电商订单智能决策系统:构建可扩展的业务规则引擎实践
java·开发语言·规则引擎·easy rules
辰九九1 小时前
Uncaught URIError: URI malformed 报错如何解决?
前端·javascript·浏览器
月亮慢慢圆1 小时前
Echarts的基本使用(待更新)
前端
芜青1 小时前
实现文字在块元素中水平/垂直居中详解
前端·css·css3
useCallback1 小时前
Elpis全栈项目总结
前端
小高0071 小时前
React useMemo 深度指南:原理、误区、实战与 2025 最佳实践
前端·javascript·react.js
LuckySusu1 小时前
【js篇】深入理解类数组对象及其转换为数组的多种方法
前端·javascript
LuckySusu1 小时前
【js篇】数组遍历的方法大全:前端开发中的高效迭代
前端·javascript
LuckySusu1 小时前
【js篇】for...in与 for...of 的区别:前端开发中的迭代器选择
前端·javascript