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

简介: 源设备向目标设备发送图像抓拍配置命令,携带传输路径、会话ID等信息。目标设备完成图像传输后,发送图像抓拍传输完成通知命令,采用IETF RFC 3428中的MESSAGE方法实现,命令流程见9.14.2。图像文件命名规则宜采用“设备编码(20位)、图像编码(2位)、时间编码(17位)、序列码(2位)”的形式,抓拍图像文件命名规则应符合表4的要求。图像格式宜使用JPEG,图像分辨率宜采用与主码流相同的分辨率。

规范解读

GB28181-2022相对2016,增加了设备软件升级、图像抓拍信令流程和协议接口。我们先回顾下规范说明:


图像抓拍基本要求


源设备向目标设备发送图像抓拍配置命令,携带传输路径、会话ID等信息。目标设备完成图像传输后,发送图像抓拍传输完成通知命令,采用IETF RFC 3428中的MESSAGE方法实现,命令流程见9.14.2。图像文件命名规则宜采用“设备编码(20位)、图像编码(2位)、时间编码(17位)、序列码(2位)”的形式,抓拍图像文件命名规则应符合表4的要求。图像格式宜使用JPEG,图像分辨率宜采用与主码流相同的分辨率

039659efd5ca9f8166b769fb423e603c.png

命令流程

990ebfc68ff571c7f57f960d6c75a4fd.png

命令流程描述如下:


a)l:源设备向SIP服务器发送图像抓拍配置命令,该命令采用MESSAGE方法携带;


b)2:SIP服务器收到命令后回复200 OK响应﹔


c)3:SIP服务器向目标设备发送图像抓拍配置命令,该命令采用MESSAGE方法携带;


d)4:目标设备收到消息3后回复200 OK响应﹔


e)5:目标设备向SIP服务器发送图像抓拍配置响应命令﹔


f)6:SIP服务器收到命令后返回200 OK;


g)7:SIP服务器向源设备转发图像抓拍配置响应命令﹔


h)8:源设备收到命令后返回200 OK;


i)9:目标设备完成图像传输后发送Message消息,通知SIP服务器图像传输已完成,消息格式应符合A.2.5.7抓拍图像传输完成通知的要求;


j)10:SIP服务器收到消息9后回复200 OK响应;k)11:SIP服务器向源设备转发消息9;


l)12:源设备收到命令11后回复200 OK。


协议接口


图像抓拍协议接口满足以下要求。


a)MESSAGE消息头Content-type头域为Content-type:Application/MANSCDP+xml。


b)图像抓拍配置命令采用MANSCDP协议格式定义:配置命令消息体采用XML封装﹐消息体元数据序列格式符合A.2.3.2.1和A.2.3.2.12的格式规定。


c)图像传输方式宜采用http。当报警触发图像抓拍时,可将报警信息携带在上传路径中,用于关联抓拍的图像。


d)图像抓拍传输完成通知命令采用MANSCDP协议格式定义:配置命令消息体采用XML,封装,XML消息体格式定义符合A.2.5.1规定的前导声明,消息体元数据序列格式符合A.2.5.7的格式规定。其中,SessionID应与图像抓拍配置命令中的SessionID一致。

技术实现

快照分两部分,一部分是按照GB28181的规范要求,平台侧需要快照的时候,本地编码需要的jpeg格式上传到平台侧的图像存储服务器,另外也可以接入端本地发起快照,本地存储。

58c6314591eae44a82e97b95b15f1433.jpg

本文以Android平台GB28181设备接入模块为例,默认,我们采用的是png格式,如果需要,也可以数据回上来,编码保存成协议规范要求的jpeg格式。

//Author: daniusdk.com
class ButtonCaptureImageListener implements View.OnClickListener {
  @SuppressLint("SimpleDateFormat")
  public void onClick(View v) {
    if(isPushingRtmp || isRecording || isRTSPPublisherRunning || isGB28181StreamRunning)
    {
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
      String imageFileName = "dn_" + timeStamp;    //创建以时间命名的文件名称
      String imagePath = imageSavePath + "/" + imageFileName + ".png";
      Log.i(TAG, "imagePath:" + imagePath);
      libPublisher.SmartPublisherSaveCurImage(publisherHandle, imagePath);
    }
    else
    {
      Log.e(TAG, "快照失败,请确保在推送、录像或内置RTSP服务发布状态..");
    }
  }
}

快照成功后,会有相应的Event回调上来,对应的事件EVENT_DANIULIVE_ERC_PUBLISHER_CAPTURE_IMAGE:

class EventHandePublisherV2 implements NTSmartEventCallbackV2 {
  @Override
  public void onNTSmartEventCallbackV2(long handle, int id, long param1, long param2, String param3, String param4, Object param5) {
    Log.i(TAG, "EventHandeV2: handle=" + handle + " id:" + id);
    String publisher_event = "";
    switch (id) {
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_STARTED:
        publisher_event = "开始..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTING:
        publisher_event = "连接中..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTION_FAILED:
        publisher_event = "连接失败..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_CONNECTED:
        publisher_event = "连接成功..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_DISCONNECTED:
        publisher_event = "连接断开..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_STOP:
        publisher_event = "关闭..";
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_RECORDER_START_NEW_FILE:
        publisher_event = "开始一个新的录像文件 : " + param3;
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_ONE_RECORDER_FILE_FINISHED:
        publisher_event = "已生成一个录像文件 : " + param3;
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_SEND_DELAY:
        publisher_event = "发送时延: " + param1 + " 帧数:" + param2;
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_CAPTURE_IMAGE:
        publisher_event = "快照: " + param1 + " 路径:" + param3;
        if (param1 == 0) {
          publisher_event = publisher_event + "截取快照成功..";
        } else {
          publisher_event = publisher_event + "截取快照失败..";
        }
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUBLISHER_RTSP_URL:
        publisher_event = "RTSP服务URL: " + param3;
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUSH_RTSP_SERVER_RESPONSE_STATUS_CODE:
        publisher_event ="RTSP status code received, codeID: " + param1 + ", RTSP URL: " + param3;
        break;
      case NTSmartEventID.EVENT_DANIULIVE_ERC_PUSH_RTSP_SERVER_NOT_SUPPORT:
        publisher_event ="服务器不支持RTSP推送, 推送的RTSP URL: " + param3;
        break;
    }
    String str = "当前回调状态:" + publisher_event;
    Log.i(TAG, str);
    Message message = new Message();
    message.what = PUBLISHER_EVENT_MSG;
    message.obj = publisher_event;
    handler_.sendMessage(message);
  }
}
相关文章
|
应用服务中间件 网络安全 nginx
快速上手!使用Docker和Nginx部署Web服务的完美指南
快速上手!使用Docker和Nginx部署Web服务的完美指南
|
存储 Java 开发工具
WinServer服务器上搭建Git代码库
本文介绍如何在WinServer服务器上搭建Git代码库。
683 0
|
存储 监控 安全
ONVIF协议介绍
ONVIF协议介绍
9043 0
|
编解码 网络协议 开发工具
GB/T28181-2022之图像抓拍规范解读和设计实现
GB/T28181-2022之图像抓拍规范解读和设计实现
566 0
|
2月前
|
存储 自然语言处理 并行计算
大模型应用:大模型量化:INT4与INT8核心差异、选型指南及代码实现.53
本文深入解析大模型INT4与INT8量化技术:从“缩放+映射”本质出发,对比二者在压缩率(75% vs 87.5%)、精度(256 vs 16离散值)、显存占用及适用场景的差异;详解scale/zero_point参数原理,并提供BitsAndBytes实战代码,助力高效本地部署。
1101 6
|
缓存 应用服务中间件 PHP
502错误是nginx返回的吗(502错误和nginx有关系吗)
本文详细介绍了Nginx出现502 Bad Gateway错误的原因及解决方法,包括缓冲区错误、Header过大和PHP-CGI进程不足等问题,并提供了增大缓冲区、调整Header大小及增加PHP-CGI进程数量的具体步骤。此外,还解释了502错误的含义及其可能原因,如上游服务器故障、网络故障和配置错误,并给出了检查上游服务器、代理配置及联系网络管理员等多种解决方案。以上内容仅供参考,具体操作需根据实际情况调整。
7407 4
|
存储 编解码 监控
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
901 13
|
机器学习/深度学习 人工智能 文字识别
ultralytics YOLO11 全新发布!(原理介绍+代码详见+结构框图)
本文详细介绍YOLO11,包括其全新特性、代码实现及结构框图,并提供如何使用NEU-DET数据集进行训练的指南。YOLO11在前代基础上引入了新功能和改进,如C3k2、C2PSA模块和更轻量级的分类检测头,显著提升了模型的性能和灵活性。文中还对比了YOLO11与YOLOv8的区别,并展示了训练过程和结果的可视化
25882 0
|
PyTorch 算法框架/工具 Python
yolov5的完整部署(适合新人和懒人,一键安装)
这篇文章为新人和希望简化部署过程的用户介绍了如何一键安装和配置YOLOv5环境,包括安装Anaconda、设置镜像源、安装PyCharm、创建虚拟环境、下载YOLOv5项目、安装依赖以及在PyCharm中配置和运行项目。
9543 0
yolov5的完整部署(适合新人和懒人,一键安装)
|
编解码 开发工具 Android开发
Android平台GB28181设备接入侧如何实现GB28181-2022实时快照
GB/T28181-2022标准中明确了快照的具体要求,包括图像抓拍配置命令的发送与接收流程。源设备需向目标设备发送包含传输路径和会话ID等信息的命令,目标设备完成图像传输后,通过IETF RFC 3428中的MESSAGE方法发送图像抓拍传输完成的通知。图像格式推荐使用JPEG,且分辨率应与主码流相同。技术实现上,如使用大牛直播SDK在Android平台上,可通过创建`SnapShotImpl`类并调用`capture()`方法实现快照功能,之后将JPEG格式的快照文件上传至国标平台。
462 2