Onvif协议学习:11、图像抓拍


文章目录

  • Onvif协议学习:11、图像抓拍
    • 1、原理简介
    • 2、编码流程
    • 3、示例代码

原文链接:https://blog.csdn.net/benkaoya/article/details/72487077

1、原理简介

IPC图像抓拍有两种方法:

  • 对RTSP视频流进行视频截图;
  • 使用HTTP的GET方式获取图片。

第一种方法我还没试过,没有发言权,以下介绍第二种方法。

ONVIF协议除了提供RTSP的URL外,其实也给出了抓拍的URL,使用Media模块的GetSnapshotUri接口可获取图像抓拍的URL。

比如,我从IPC获得的抓拍URL为:

http://100.100.100.160/onvifsnapshot/media_service/snapshot?channel=1&subtype=0。

那如何通过这个地址获得图片呢?其实在media.wsdl中,该接口的函数功能说明中已经描述的很清楚了:「The URI can be used for acquiring a JPEG image through a HTTP GET operation」,也就是通过HTTP的GET方式获得JPEG图片。

在浏览器上输入抓拍的URL,在浏览器中就会显示出图片,刷新,图片会变化,对于需要验证的IPC,会要求我们输入用户名密码进行HTTP用户认证。

2、编码流程

  • 通过「设备发现」,得到 「设备服务地址」。

  • 使用「设备服务地址」调用GetCapabilities接口,得到「媒体服务地址」。

  • 使用「媒体服务地址」调用GetProfiles接口,得到主次码流的「媒体配置信息」,其中包含ProfileToken。

  • 使用ProfileToken 调用GetSnapshotUri接口,得到主次码图像抓拍的URI地址。

  • 根据URI地址,使用HTTP的GET方式获取图片。

3、示例代码

Windows的MFC里有CInternetSession,CHttpConnection,CHttpFile这些类提供通过HTTP获得图像数据。

Linux可以使用很多开源方案,甚至可以直接使用shell命令wget来下载图像即可,简单高效。比如:

wget -O out.jpeg 'http://100.100.100.5:80/capture/webCapture.jpg?channel=1&FTpsend=0&checkinfo=0'

如果需要带认证信息,可以使用:

wget -O out.jpeg 'http://username:password@100.100.100.5:80/capture/webCapture.jpg?channel=1&FTpsend=0&checkinfo=0'

以下的示例代码就是使用wget实现的图像抓拍功能。

/************************************************************************
**函数:make_uri_withauth
**功能:构造带有认证信息的URI地址
**参数:[in]  src_uri       - 未带认证信息的URI地址[in]  username      - 用户名[in]  password      - 密码[out] dest_uri      - 返回的带认证信息的URI地址[in]  size_dest_uri - dest_uri缓存大小
**返回:0成功,非0失败
**备注:1). 例子:无认证信息的uri:rtsp://100.100.100.140:554/av0_0带认证信息的uri:rtsp://username:password@100.100.100.140:554/av0_0
************************************************************************/
static int make_uri_withauth(char *src_uri, char *username, char *password, char *dest_uri, unsigned int size_dest_uri)
{int result = 0;unsigned int needBufSize = 0;SOAP_ASSERT(NULL != src_uri);SOAP_ASSERT(NULL != username);SOAP_ASSERT(NULL != password);SOAP_ASSERT(NULL != dest_uri);memset(dest_uri, 0x00, size_dest_uri);needBufSize = strlen(src_uri) + strlen(username) + strlen(password) + 3;    // 检查缓存是否足够,包括‘:’和‘@’和字符串结束符if (size_dest_uri < needBufSize) {SOAP_DBGERR("dest uri buf size is not enough.\n");result = -1;goto EXIT;}if (0 == strlen(username) && 0 == strlen(password)) {                       // 生成新的uri地址strcpy(dest_uri, src_uri);} else {char *p = strstr(src_uri, "//");if (NULL == p) {SOAP_DBGERR("can't found '//', src uri is: %s.\n", src_uri);result = -1;goto EXIT;}p += 2;memcpy(dest_uri, src_uri, p - src_uri);sprintf(dest_uri + strlen(dest_uri), "%s:%s@", username, password);strcat(dest_uri, p);}EXIT:return result;
}/************************************************************************
**函数:ONVIF_GetSnapshotUri
**功能:获取设备图像抓拍地址(HTTP)
**参数:[in]  MediaXAddr    - 媒体服务地址[in]  ProfileToken  - the media profile token[out] uri           - 返回的地址[in]  sizeuri       - 地址缓存大小
**返回:0表明成功,非0表明失败
**备注:1). 并非所有的ProfileToken都支持图像抓拍地址。举例:XXX品牌的IPC有如下三个配置profile0/profile1/TestMediaProfile,其中TestMediaProfile返回的图像抓拍地址就是空指针。
************************************************************************/
int ONVIF_GetSnapshotUri(const char *MediaXAddr, char *ProfileToken, char *uri, unsigned int sizeuri)
{int result = 0;struct soap *soap = NULL;struct _trt__GetSnapshotUri         req;struct _trt__GetSnapshotUriResponse rep;SOAP_ASSERT(NULL != MediaXAddr);SOAP_ASSERT(NULL != uri);memset(uri, 0x00, sizeuri);SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);memset(&req, 0x00, sizeof(req));memset(&rep, 0x00, sizeof(rep));req.ProfileToken = ProfileToken;result = soap_call___trt__GetSnapshotUri(soap, MediaXAddr, NULL, &req, &rep);SOAP_CHECK_ERROR(result, soap, "GetSnapshotUri");dump_trt__GetSnapshotUriResponse(&rep);result = -1;if (NULL != rep.MediaUri) {if (NULL != rep.MediaUri->Uri) {if (sizeuri > strlen(rep.MediaUri->Uri)) {strcpy(uri, rep.MediaUri->Uri);result = 0;} else {SOAP_DBGERR("Not enough cache!\n");}}}EXIT:if (NULL != soap) {ONVIF_soap_delete(soap);}return result;
}void cb_discovery(char *DeviceXAddr)
{int stmno = 0;                                                              // 码流序号,0为主码流,1为辅码流int profile_cnt = 0;                                                        // 设备配置文件个数struct tagProfile *profiles = NULL;                                         // 设备配置文件列表struct tagCapabilities capa;                                                // 设备能力信息char cmd[256];char uri[ONVIF_ADDRESS_SIZE] = {0};                                         // 不带认证信息的URI地址char uri_auth[ONVIF_ADDRESS_SIZE + 50] = {0};                               // 带有认证信息的URI地址ONVIF_GetCapabilities(DeviceXAddr, &capa);                                  // 获取设备能力信息(获取媒体服务地址)profile_cnt = ONVIF_GetProfiles(capa.MediaXAddr, &profiles);                // 获取媒体配置信息(主/辅码流配置信息)if (profile_cnt > stmno) {ONVIF_GetSnapshotUri(capa.MediaXAddr, profiles[stmno].token, uri, sizeof(uri)); // 获取图像抓拍URImake_uri_withauth(uri, USERNAME, PASSWORD, uri_auth, sizeof(uri_auth)); // 生成带认证信息的URI(有的IPC要求认证)sprintf(cmd, "wget -O out.jpeg '%s'", uri_auth);                        // 使用wget下载图片system(cmd);}if (NULL != profiles) {free(profiles);profiles = NULL;}
}int main(int argc, char **argv)
{ONVIF_DetectDevice(cb_discovery);return 0;
}

Onvif协议学习:11、图像抓拍相关推荐

  1. Onvif协议学习:4、门外汉理解Onvif协议

    Onvif协议学习:4.门外汉理解Onvif协议 文章目录 Onvif协议学习:4.门外汉理解Onvif协议 1.ONVIF背景 2.ONVIF技术框架 3.ONVIF技术规格 4.ONVIF接口规范 ...

  2. Onvif协议学习:13、遮挡报警

    Onvif协议学习:13.遮挡报警 文章目录 Onvif协议学习:13.遮挡报警 1.原理简介 (1).Basic Notification (2).Pull-Point Notification 2 ...

  3. Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习:14.球机云台控制PTZ 文章目录 Onvif协议学习:14.球机云台控制PTZ 一.介绍 二.代码实现 八个方向.放下及缩小控制 聚焦控制 原文链接:https://blog.c ...

  4. Onvif协议学习:3、了解web services

    Onvif协议学习:3.了解web services 文章目录 Onvif协议学习:3.了解web services 1.远程调用 2.远程调用原理 3.Web Services的简单理解 4.Web ...

  5. Onvif协议学习:1、Onvif与Onvif Profile协议基本概念

    Onvif协议学习:1.Onvif与Onvif Profile协议基本概念 文章目录 Onvif协议学习:1.Onvif与Onvif Profile协议基本概念 1.ONVIF 2.Onvif Pro ...

  6. Onvif协议学习:7、鉴权认证

    Onvif协议学习:7.鉴权认证 文章目录 Onvif协议学习:7.鉴权认证 1.前言 2.ONVIF哪些接口需要认证 3.如何认证 4.安装OpenSSL 5.实现认证 6.特别注意 原文链接:ht ...

  7. 小米摄像头有onvif协议_监控摄像头完好但图像不行,肯定逃不过这10个问题

    摄像头仅仅是视频监控系统的一部分,即使摄像头完好无损,监控画面也可能会出现不显示.卡顿.丢失等情况.想要彻底解决网络监控的问题,往往需要排查各个连接设备才可以判断.下面我们就总结了10个问题,彻底解决 ...

  8. GB/T28181-2022图像抓拍规范解读及技术实现

    规范解读 GB28181-2022相对2016,增加了设备软件升级.图像抓拍信令流程和协议接口.我们先回顾下规范说明: 图像抓拍基本要求 源设备向目标设备发送图像抓拍配置命令,携带传输路径.会话ID等 ...

  9. ONVIF协议 简介

    一.简单介绍 1形成 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为ONVIF(Open N ...

  10. 安防百科-单了解ONVIF 协议

    什么是ONVIF ? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在2008年共同成立的一个国 ...

最新文章

  1. 友盟小米收不到推送消息_Android 手机收不到消息推送的设置指南 - 融云 RongCloud...
  2. 智领新时代 慧享新生活 —— CITE2018新闻发布会在北京召开
  3. 搞事情?!2020云·创季来啦,量子位带你领略云产业的耳目一新!
  4. iOS上获取iTunes音乐权限
  5. 深拷贝的缺点_JavaScript 深拷贝
  6. 极端高温导致澳大利亚断网
  7. python海龟图画龙珠_火影,海贼王,七龙珠,还在为漫画书发愁!我用Python一键生成电子漫画书...
  8. BugkuCTF-WEB题秋名山车
  9. [Xcode 实际操作]五、使用表格-(8)自定义UITableView单元格Accessory样式(附件图标)
  10. ORACLE之常用FAQ V1.0二(构架系统) (1)
  11. 计算N阶行列式的详细讲解(C语言)(降阶法)(函数递归)
  12. ansible:jinja2对特殊符号的处理
  13. 【优化求解】基于头脑风暴优化算法BSO求解最优目标matlab源码
  14. G711音频编码格式
  15. java中输出一天每半个小时的时间段
  16. 用邮箱发简历,主题怎么写,正文怎么写
  17. 状压搜索 Circling Round Treasures:CodeForces - 375C
  18. 安装flashplay的debug版本调试flex
  19. 中国粒子对撞机曝光:迄今世界最大
  20. linkedin 分享_如何管理您的LinkedIn隐私设置

热门文章

  1. 计算机专业交互式教学课件制作,简易交互式课件的制作
  2. 51单片机4位抢答器_倒计时可调仿真设计
  3. mysql 数据库索引命名规范_MYSQL数据库命名及设计规范
  4. 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
  5. CommandArgument 与 CommandName 属性
  6. NOR Flash 和 NAND Flash 闪存详解
  7. 强化学习平台安装 Mujoco、mujoco-py、gym、baseline
  8. cad快速看图能合并图纸吗_怎样才能把2张CAD图纸合并
  9. 天语手机android 4.4.4,天语 touch 2 4.4.4 ROM刷机包 FIUI
  10. android3.0新功能,PCWorld:Android 3.0最受期待的五大新功能