GB28181协议请求关键帧

1.概述。

        GB28181协议2016标准中规定控制命令中支持强制关键帧命令,现在我们使用exosip2库和tinyxml2库来组建并发送该命令。

2.命令格式

GB28181-2016标准

3.实现

创建XML

创建请求并发送

4.说明

        remoteCodeId:下级平台国标编码ID

        remoteIp:下级平台ip地址

        remotePort:下级平台sip通信端口

        dstDeviceCodeId:要发送关键帧的设备国标编码ID

        m_localInfo.codeId:本机国标编码ID

        m_localInfo.ip:本机ip地址

        m_localInfo.sipPort:本机sip通信端口

1、支持国标GB28181平台、国标GB28181 IPC和国标GB28181 NVR设备同时接入 (支持GB28181-2011版本和GB28181-2016版本)     2、支持国标GB28181设备注册和注销,对所有设备进行管理,获取资源 对资源列表进行管理     3、支持国标GB28181的目录订阅,对接收的订阅通知进行处理     4、支持国标GB28181实时视频请求(支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     5、支持国标GB28181 PTZ控制     6、支持国标GB28181 录像查询     7、支持国标GB28181 历史视频点播 (支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     8、支持国标GB28181 历史视频下载 (支持UDP、TCP主动(tcpactive)、TCP被动(tcppassive))     9、支持对接收的国标实时视频码流和历史视频码流进行管理     10、支持将国标的PS码流转换成ES码流     11、支持丢包打印和断流打印     13、支持RTSP服务和RTSP会话管理     14、支持RTSP客户端 UDP传输和TCP传输     15、支持国标GB28181设备5000路左右的接入管理,支持国标请求视频在100路左右     16、支持国标28181设备和通道写入mysql数据库      17、支持设备的云台PTZ控制,控制类型:上"up",下"down",左"left",右"right",左上"leftup",左下"leftdown",右上"rightup",右下"rightdown",镜头近"zoomin",镜头远"zoomout", 焦距远"focusfar",焦距近"focusnear", 设置预置位"setpos",调预置位"callpos"     18、支持历史视频的查询和历史视频的点播控制     19、支持对国标设备的控制,"record":录像开启和停止-通道id "guard":布放和撤防-报警通道id "reboot":设备重启-设备id "keyfame":强制关键帧-通道id     20、支持对实时视频的图片截图,通过http直接访问图片    21、支持rtmp和hls会话一直保留    22、支持报警消息(设备上线、下线和设备端报警)通过httpclient方式主动通知    23、支持公网和局域网同时存在
### GB28181 C++ 源码实现概述 GB28181 是中国国家标准,用于视频监控系统的联网系统信息传输、交换、控制技术要求。以下是基于不同场景下使用C++编写的GB28181设备端源码的关键特性: #### 注册与注销流程 为了使设备能够接入到GB28181平台,需先执行注册操作。此过程涉及SIP协议的应用,通过eXosip库来构建请求消息并向服务器发起连接尝试[^1]。 ```cpp // 初始化 eXosip 库并设置回调函数 void init_exosip() { exosip_init(); } // 构建 SIP REGISTER 请求 int send_register(const char *username, const char *password) { struct osip_message *msg; /* 创建REGISTER消息 */ int i = create_sip_request(&msg, "REGISTER", username); if (i != 0 || msg == NULL) return -1; /* 添加认证头域 */ add_auth_header(msg, password); /* 发送消息 */ exosip_transaction_t* tr = exosip_register_send(ex_context(), msg); } ``` #### 实现保活心跳机制 保持会话的有效性对于长时间在线的服务至关重要。通常每隔一段时间就向服务器发送一次OPTIONS或MESSAGE类型的SIP信令作为心跳信号。 ```cpp // 定义定时器触发的心跳检测逻辑 void keep_alive_timer_callback(void*) { // 向服务器发送 OPTIONS 或 MESSAGE 类型的消息 send_options_or_message("OPTIONS"); } ``` #### 响应查询命令 针对来自上层管理平台发出的各种查询指令(如获取设备列表),需要解析收到的数据包,并按照规定格式返回相应的XML文档给对方。 ```xml <?xml version="1.0" encoding="UTF-8"?> <QueryResponse> <!-- 设备详情 --> </QueryResponse> ``` #### 处理媒体流推送 无论是本地文件(.h264)[^2]还是网络摄像机(RTSP)[^3]乃至其他输入源(USB Camera/Desktop Screen)[^4][^5]所捕获的画面,在接收到播放指示后都应当转换成适合在网络上传输的形式——即RTP封装后的PS流数据。 ```cpp // 对于H.264编码的原始比特流传入情况下的处理方式 bool handle_h264_stream(std::string& h264_data) { // 转换为 PS 流格式 std::vector<uint8_t> ps_frame = convert_to_ps(h264_data.c_str()); // 使用 RTP 协议打包帧数据 rtp_packetize(ps_frame.data(), ps_frame.size()); } // RTSP直播流的情况则更为复杂些... void start_rtsp_live_transmission(const char* rtsp_url) { cv::VideoCapture cap(rtsp_url); // 打开RTSP链接 while(true){ Mat frame; cap >> frame; // 获取一帧图像 // 进行必要的预处理... // 推送到远端 transmit_rtp(frame); usleep(40000); // 控制帧率 } } ``` 以上展示了如何利用C++编程语言配合特定第三方库(e.g., OpenCV, FFmpeg)以及遵循GB28181标准的要求去开发一套完整的解决方案框架。实际项目中可能还需要考虑更多细节方面的工作,比如错误恢复策略的设计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值