GB28181学习(十八)——图像抓拍

前言

本文主要介绍图像抓拍功能,通过自研的sip库(mysipsdk.dll)对接真实设备,使用http方式实现图像数据传输,最终达到图像抓拍与保存的目的。

基本要求

  • 图像格式宜使用JPEG;
  • 图像分辨率宜采用与主码流相同的分辨率;
  • 抓拍图像文件命令宜遵循如下格式:

在这里插入图片描述

协议接口

  • MESSAGE消息头Content-type头域为Content-type:Application/MANSCDP+xml;
  • 图像传输方式宜使用http;
  • 图像抓拍传输完成中的SessionID应与图像抓拍配置中的SessionID一致;

流程图

在这里插入图片描述

流程说明:

  • SIP服务器(mysipsdk.dll)向设备端发送图像抓拍配置命令;
  • 设备端返回200 OK;
  • 设备端返回图像抓拍配置响应;
  • SIP服务器(mysipsdk.dll)返回200 OK;
  • 设备端将图像数据传输至图片存储服务器;
  • 设备端发送图像抓拍传输完成消息;
  • SIP服务器(mysipsdk.dll)返回200 OK;

设计

  1. SIP服务器(mysipsdk.dll)向设备端发送图像抓拍配置命令;

参数说明:

SnapNum:连拍张数,最多10张,当为手动抓拍时取值为1
Interval:单张抓拍间隔时间,单位:秒,最短为1秒
UploadURL:抓拍图像上传路径,例如:http://192.168.1.121/uploadsnapshot?token=xxx
SessionID:会话ID,由平台生成,用于关联抓拍的图像和平台请求,SessionID由大小写英文字母、数字、短划线组成,长度32~128字节

代码示例:

int CGBDeviceConfig::SnapShotConfig_(CMyGBDevice* device, const std::string& deviceID, const std::string& request)
{if (!device || deviceID.empty() || request.empty())return -1;Json::Value value;Json::Reader reader;if (!reader.parse(request.c_str(), value))return -1;std::string sn = GetConfigSN();std::string uploadURL = value["uploadURL"].asString();std::string sessionID = value["sessionID"].asString();int snapNum = value["snapNum"].asInt();int interval = value["interval"].asInt();char snapShotInfo[500] = { 0 };snprintf(snapShotInfo, 500,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n""<Control>\n""<CmdType>DeviceConfig</CmdType>\n""<SN>%s</SN>\n""<DeviceID>%s</DeviceID>\n""<SnapShotConfig>\n""<SnapNum>%d</SnapNum>\n""<Interval>%d</Interval>\n""<UploadURL>%s</UploadURL>\n""<SessionID>%s</SessionID>\n""</SnapShotConfig>\n""</Control>\n", sn.c_str(), deviceID.c_str(), snapNum, interval, uploadURL.c_str(), sessionID.c_str());return CMySipContext::GetInstance().SendSipMessage(device, snapShotInfo);
}
  1. 设备端发送图像抓拍传输完成消息,SIP服务器(mysipsdk.dll)做解析;

主要流程:

1) 接收响应消息;
2) xml解析;
3) 判断CmdType是否为"UploadSnapShotFinished";
4) 如果3)步骤为是,解析返回消息并回调至应用层;

图像抓拍返回字段说明:

CmdType:固定为字符串"UploadSnapShotFinished"
SessionID:会话ID,由平台生成,用于关联抓拍的图像和平台请求
SnapShotList:抓拍图像标识列表
SnapShotFileID:抓拍图像唯一标识,由前端抓拍设备生成

代码示例:

bool CDeviceConfigMethod::OnRecvMsg(pjsip_rx_data* rdata)
{if (PJSIP_OTHER_METHOD == rdata->msg_info.cseq->method.id){CMyXmlParser xmlParser(CMySipContext::GetInstance().GetMessageBody(rdata));CMyDynamicStruct dynamicStruct;dynamicStruct.Set(xmlParser.GetXml());auto cmd = xmlParser.GetXml()->RootElement()->Value();auto cmdType = dynamicStruct.Get("CmdType");if ("UploadSnapShotFinished" == cmdType){CSnapShotFinishInfo snapShotInfo;snapShotInfo.deviceID = dynamicStruct.Get("DeviceID");snapShotInfo.sessionID = dynamicStruct.Get("SessionID");std::string snapShotList = dynamicStruct.Get("SnapShotList");Json::Reader reader;Json::Value value;reader.parse(snapShotList, value);int size = value.size();for (int i = 0; i < size; i++){Json::Value val = value[i];std::string snapShotfileID = val["SnapShotFileID"].asString();snapShotInfo.snapShotFileIDs.push_back(snapShotfileID);}// 回调至应用层,需注册if (m_dataCB)m_dataCB(m_handleType, m_user, &snapShotInfo);}else{return false;}Response(rdata, PJSIP_SC_OK, NoHead);return true;}return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux ksm实现与代码简述

KSM 全称是 Kernel Samepage Merging&#xff0c;表示相同的物理页只映射一份拷贝。 原理 在ksm初始化时&#xff08;ksm_init&#xff09;&#xff0c;注册了一个ksm_scan_thread线程&#xff0c;这个线程的核心入口是ksm_do_scan。当对一个进程第一次通过madvice(MADV_MERGE…

Linux高级管理-基于域名的虚拟Web主机搭建

客服机限制地址 通过 Require 配置项&#xff0c;可以根据主机的主机名或P地址来决定是否允许客户端访问。在httpd服 务器的主配置文件的<Location>&#xff0c;<Directory>、<Files>、<Limit>配置段中均可以使用Require 配置 项来控制客户端的访问。使…

Java基础:如何创建多层文件夹

一、单层多个 代码实现如下&#xff1a; public class Main {public static void main(String[] args) {//在D盘中创建File file new File("D:"File.separator"docum");file.mkdir();//在D盘中的docum目录中创建file new File("D:\\docum" Fi…

kafka 详细介绍

目录 前言 分布式架构&#xff1a; 消息发布-订阅模型&#xff1a; 持久性存储&#xff1a; 分区和副本&#xff1a; 水平扩展&#xff1a; 高性能&#xff1a; 生态系统&#xff1a; 我的其他博客 前言 Kafka 是由 Apache 软件基金会开发的一种开源流处理平台&#xf…

微信小程序自定义提示框组件并使用插槽 tooltip

创建tooltip组件引用 创建一个自定义组件&#xff0c;例如命名为 tooltip tooltip.wxml&#xff1a;用于定义组件的结构&#xff1b; <!--components/tooltip/tooltip.wxml--> <view class"tooltip-wrapper" hidden"{{hidden}}" style"lef…

纺织辅料小程序商城制作全攻略

随着互联网的普及和移动支付的便捷性&#xff0c;越来越多的消费者喜欢在线购物&#xff0c;尤其是购买纺织辅料这类产品。为了满足消费者的需求&#xff0c;纺织辅料企业或商家需要制作一个专业的小程序商城&#xff0c;以便更好地展示和销售自己的产品。本文将详细介绍如何制…

Fine-Grained Semantically Aligned Vision-Language Pre-Training细粒度语义对齐的视觉语言预训练

abstract 大规模的视觉语言预训练在广泛的下游任务中显示出令人印象深刻的进展。现有方法主要通过图像和文本的全局表示的相似性或对图像和文本特征的高级跨模态关注来模拟跨模态对齐。然而&#xff0c;他们未能明确学习视觉区域和文本短语之间的细粒度语义对齐&#xff0c;因为…

Java开发环境简介(JDK、JRE、JVM)

目录 1、Java开发环境 2、JDK和JRE 3、JDK下载和安装 3.1 下载 3.2 安装 3.3 配置path环境变量 JDK8配置方案1&#xff1a;只配置path ⭐JDK8配置方案2&#xff1a;配置JAVA_HOMEpath&#xff08;推荐&#xff09; path配置小结 JDK17配置方案&#xff1a;自动配置 …

redis-学习笔记(Jedis 前置知识)

自定义的 Redis 客户端 咱们可以实现编写出一个自定义的 Redis 客户端 因为 Redis 公开了自己使用的自定义协议 ---- RESP 协议清楚了, 那么通信数据格式就清除了, 就能完成各层次之间的数据传输, 就能开发服务器和客户端 RESP — Redis 的 序列化 协议 特点: 简单好实现快读进…

AC修炼计划(AtCoder Beginner Contest 332)

传送门&#xff1a;AtCoder Beginner Contest 332 - AtCoder a,b,c都还是很基础了。d题是一个bfs的纯暴力问题。 E - Lucky bag 看看范围&#xff0c;n15&#xff0c;第一个想法是dfs纯暴力&#xff0c;但所有的情况太大&#xff0c;各种决策层出不穷&#xff0c;会t。所以转…

RocketMQ可视化工具 打包遇到的yarn intall 问题

文章目录 RocketMQ可视化工具1.github上下载2.修改参数3.运行4.打包5.出错6.解决7.重试8.再解决9.很奇怪运行没错&#xff0c;但是测试错啦10.不想深究&#xff0c;直接跳过测试11.展示成功 RocketMQ可视化工具 1.github上下载 下载地址 https://github.com/apache/rocketmq-…

redis:二、缓存击穿的定义、解决方案(互斥锁、逻辑过期)的优缺点和适用场景、面试回答模板

缓存击穿的定义 缓存击穿是一种现象&#xff0c;具体就是某一个数据过期时&#xff0c;恰好有大量的并发请求过来&#xff0c;这些并发的请求可能会瞬间把DB压垮。典型场景就是双十一等抢购活动中&#xff0c;首页广告页面的数据过期&#xff0c;此时刚好大量用户进行请求&…

Unity 置顶OpenFileDialog文件选择框

置顶文件选择框 &#x1f32d;处理前&#x1f959;处理后 &#x1f32d;处理前 &#x1f959;处理后 解决方案

【TI毫米波雷达入门-10】TI毫米波速度检测思路

知识回顾 FMCW chirp 雷达收发流程 中频信号 傅里叶变换 多目标检测 距离分辨率 最大距离 公式总结 FMCW数据处理流程示例 两个维度看图表 从range维度&#xff0c;水平方向上&#xff0c;反映每个chirp 发出的FMCW被接收天线检测到&#xff0c;2个点的目标&#xff0c;对应两个…

滑动窗口如人生,回顾往事不复还———力扣刷题

第一题&#xff1a;长度最小的子数组 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路&#xff1a; 第一想法肯定时暴力枚举&#xff0c;枚举数组任何一个元素&#xff0c;把他当起始位置&#xff0c;然后从起始位置找最短区间&#xff0c;使得…

uniapp原生插件之安卓app添加到其他应用打开原生插件

插件介绍 安卓app添加到其他应用打开原生插件&#xff0c;接收分享的文本和文件&#xff0c;支持获取和清空剪切板内容 插件地址 安卓app添加到其他应用打开原生插件&#xff0c;支持获取剪切板内容 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 u…

Nyquist Theorem(取样定理)

取样定理&#xff0c;又称为奈奎斯特定理&#xff08;Nyquist Theorem&#xff09;&#xff0c;是信号处理领域中一项至关重要的基本原理。它规定了对于连续时间信号&#xff0c;为了能够完全准确地还原出原始信号&#xff0c;即使是在离散时间下进行采样和再构建&#xff0c;都…

【JUC】二十七、synchronized锁升级之无锁

文章目录 1、背景2、Monitor、Java对象、线程如何关联起来的&#xff1f;3、synchronized锁升级4、锁升级之无锁 关于synchronized同步&#xff0c;能用无锁结构就不要用锁&#xff1b;能锁块&#xff0c;就不要锁整个方法&#xff1b;能用对象锁&#xff0c;就不要用类锁。 用…

python算法例18 滑动窗口的最大值

1. 问题描述 给定一个可能包含重复整数的数组和一个大小为k的滑动窗口&#xff0c;从左到右在数组中滑动这个窗口&#xff0c;找到数组中每个窗口内的最大值。 2. 问题示例 给出数组[1&#xff0c;2&#xff0c;7&#xff0c;7&#xff0c;8]&#xff0c;滑动窗口大小为k3&a…

Redis - 主从集群下的主从复制原理

主从复制过程 数据同步演变过程 sync 同步 Redis 2.8 版本之前&#xff0c;首次通信成功后&#xff0c; slave 会向 master 发送 sync 数据同步请求。然后 master 就会将其所有数据全部发送给 slave &#xff0c;由 slave 保存到其本地的持久化文件中。这个过 程…