海康威视(iSecure Center综合安防管理平台)第三方通过标准协议对接视频流分享

一、 场景描述

         第三方对接 iSC 平台视频功能的时候,大多数情况下都是通过集成我们的视频 SDK( 包括
视频 web 插件、客户端插件、视频 SDK-win32/win64 、视频 SDK-Android/iOS ) 来实现视频
功能的对接,但还是有很大一部分第三方有通过标准协议 (RTSP/RTMP/HLS) 来对接视频流需
求,接下来主要介绍下这三种协议的对接方式
注:关于JAVA如何对接海康威视(iSecure Center综合安防管理平台)门禁和摄像头视频取流,可参考: http://t.csdnimg.cn/yEvFh

二、 流程简介

协议说明:
RTSP
实时串流协议( Real Time Streaming Protocol RTSP )是一种网络应用协议,
专为娱乐和通信系统的使用,以控制流媒体 服务器。该协议用于建立和控制终端
之间的媒体会话。媒体服务器的客户端发布 VCR 命令,例如播放,录制和暂停,
以便于实时控制从服务器到客户端(视频点播)或从客户端到服务器(语音录音)
的媒体流。
HLS
HTTP Live Streaming (缩写是 HLS )是一个由苹果公司提出的基于 HTTP 的流媒
体网络传输协议。
RTMP
实时消息协议(英语: Real-Time Messaging Protocol ,缩写 RTMP )也称实时消
息传输协议,是最初由 Macromedia 为通过互联网在 Flash 播放器与一个服务器
之间传输流媒体音频、视频和数据而开发的一个专有协议。
通过标准协议对接,主要包括以下几个步骤:
1 、 查询监控点信息:通过 OpenApi 接口查询到监控点信息,包括监控点编号、监控点名称、
取流协议等;
2 、 查询监控点的取流 url :通过 OpenApi 接口,根据查询到的监控点信息获取对应的预览、
回放的取流 url
3 、 根据取流 url 开始取流:获取到标准协议的取流 url ,通过第三方播放器发起取流请求,
开始取流,实现视频功能对接。

三、 接口调用流程

1. 查询监控点信息

        第三方调用 API 的视频资源相关接口查询监控点信息,获取到监控点的编号以及监控点
的取流类型。接口定义如下:
 {
    "code": "0", 
    "msg": "success", 
    "data": {
        "total": 13, 
        "pageNo": 1, 
        "pageSize": 1, 
        "list": [
            {
                "altitude": null, 
                "cameraIndexCode": "eddf8458f74d42e9bf4ecfc752dba146", 
                "cameraName": "3层吉米后厨入口", 
                "cameraType": 0, 
                "cameraTypeName": "枪机", 
                "capabilitySet": "io,event_io,event_ias,event_rule,event_heat,record,net,event_face,vss,ptz,status,maintenance,event_device", 
                "capabilitySetName": null, 
                "intelligentSet": null, 
                "intelligentSetName": null, 
                "channelNo": "33", 
                "channelType": "digital", 
                "channelTypeName": "数字通道", 
                "createTime": "2018-09-15T11:14:27.812+08:00", 
                "encodeDevIndexCode": "1d3d5c26e6174cf1aa452f57cac91879", 
                "encodeDevResourceType": null, 
                "encodeDevResourceTypeName": null, 
                "gbIndexCode": null, 
                "installLocation": null, 
                "keyBoardCode": null, 
                "latitude": null, 
                "longitude": null, 
                "pixel": null, 
                "ptz": null, 
                "ptzName": null, 
                "ptzController": null, 
                "ptzControllerName": null, 
                "recordLocation": null, 
                "recordLocationName": null, 
                "regionIndexCode": "2feadc43-ffef-464b-a2e2-b146a02de5ba", 
                "status": null, 
                "statusName": null, 
                "transType": 1, 
                "transTypeName": "TCP", 
                "treatyType": null, 
                "treatyTypeName": null, 
                "viewshed": null, 
                "updateTime": "2018-09-15T11:19:48.973+08:00"
            }
        ]
    }
}
 
其 中 :
(1)"cameraIndexCode": "eddf8458f74d42e9bf4ecfc752dba146" 是 监控点编号; (2)"capabilitySet":
"io,event_io,event_ias,event_rule,event_heat,record,net,event_face,vss,ptz,status,maintenance,event_device"
监控点的能力集;
(3)"transType": 1, "transTypeName": "TCP"是对监控点取流类型的说明。

2. 获取监控点的取流 url

        获取监控点取流 url 主要包括预览和回放,又分别区分 RTSP/RTMP/HLS 三种协议的取流。

2.1 获取监控点预览取流 URL

        获取监控点预览取流 URL 的接口说明如下:
streamType: 码流类型,主码流、子码流、第三码流等;
transmode :传输协议,指的是码流的传输协议,以获取的监控点信息中 transType 为准;
protocol :取流协议,区分是获取 RTSP/RTMP/HLS 哪种协议的取流 URL
RTSP 协议:
        获取的 RTSP 取流 url 通常都是用 vlc 播放测试,由于 vlc 只能解析 rtp 封装的 rtsp 的码
流,所以,获取取流 url 的时候,入参中的 expand 值要传 streamform=rtp ,告诉 mgc 把码流
rtp 封装。
{
"cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
"streamType": 0,
"protocol": "rtsp",
"transmode": 1,
"expand": "streamform=rtp"
}
RTMP 协议:
        Rtmp 协议支持的码流编码格式是 h264 ,音频格式是 aac( 前端是复合流时 ) ,需要注意前
端的码流编码格式 ( 通常子码流的编码格式满足条件,获取取流 url 的时候可以把 streamtype
1 ,取子码流 )
        常见问题是 1.2.0 平台 (mgc V5.7.0) 生成的取流 url ,在 vlc ckplayer 等通用播放器中播放
失败,是已知问题 ( 由于 mgc 解析 rtmp 的取流 url 异常 ) ,需要打 mgc 的补丁。
{
"cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
"streamType": 1,
"protocol": "rtmp",
"transmode": 1
}
HLS 协议:
        hls 协议支持的码流编码格式也是 h264 ,音频格式是 aac( 前端是复合流时 ) ,需要注意前
端的码流编码格式。(通常子码流的编码格式满足条件,获取取流 url 的时候可以把 streamtype
1 ,取子码流 )
{
"cameraIndexCode": "748d84750e3a4a5bbad3cd4af9ed5101",
"streamType": 1,
"protocol": "hls",
"transmode": 1
}

2.2 获取监控点回放取流 URL

        获取监控点回放取流 URL 的接口说明如下:
recordLocation :存储类型, 0 :中心存储, 1 :设备存储,默认为中心存储
transmode :传输协议,指的是码流的传输协议,国标设备存储参考监控点信息中 transType
uuid :分页查询 id ,只有当查询的录像片段超过 1000 的时候,需要查询后边分页中的
录像片段时才需要,所以,第一次查询录像不需要该参数;
protocol :取流协议,区分是获取 RTSP/RTMP/HLS 哪种协议的取流 URL
RTSP 协议:
        常见问题还是通过 VLC 播放失败,入参中的 expand 的值要传 streamform=rtp
{
"cameraIndexCode": "90ad77d8057c43dab140b77361606927",
"recordLocation": "0", "protocol": "rtsp",
"transmode": 1,
"beginTime": "2017-06-15T00:00:00.000+08:00",
"endTime": "2017-06-18T00:00:00.000+08:00",
"expand": "streamform=rtp"
}
RTMP 协议:
        Rtmp 协议支持的码流编码格式是 h264 ,音频格式是 aac ,所以需要确认录像的编码格
式。
{
"cameraIndexCode": "90ad77d8057c43dab140b77361606927",
"recordLocation": "0",
"protocol": "rtmp",
"transmode": 1,
"beginTime": "2017-06-15T00:00:00.000+08:00",
"endTime": "2017-06-18T00:00:00.000+08:00"
}
HLS 协议:
        HLS 协议回放只支持海康 SDK 协议、 EHOME 协议、 ONVIF 协议接入的设备;只支持 H264
视频编码和 AAC 音频编码;云存储版本要求 v2.2.4 及以上的 2.x 版本,或 v3.0.5 及以上的
3.x 版本; ISC 版本要求 v1.2.0 版本及以上,需在运管中心 - 视频联网共享中切换成启动平台
内置 VOD
{
"cameraIndexCode": "90ad77d8057c43dab140b77361606927",
"recordLocation": "0",
"protocol": "hls",
"transmode": 1,
"beginTime": "2017-06-15T00:00:00.000+08:00",
"endTime": "2017-06-18T00:00:00.000+08:00"
}

3. 根据取流 url 开始取流

        上一步获取到监控点的取流 url 后,就可以通过第三方播放器或者插件发起取流请求。
各种协议常用的取流播放器或插件如下:
RTSP 协议: VLC
RTMP 协议: VLC CKPlayer FlashPlayer
HLS 协议: VLC CKPlayer 、手机浏览器等;
        回放取流的时候,需要注意下在取流 url 后边增加 beginTime( 录像回放的开始时间 )
endTime( 录像回放的停止时间 ) playBackMode( 回放模式 ) 相关参数,格式如下:
rtsp://211.139.111.82:554/openUrl/6YNAVUs?beginTime=20190812T000000&endTime=201908
12T000500&playBackMode=1
rtmp://120.234.141.53:1935/vod/openUrl/JG0YnLy?beginTime=20190719T150000&endTime=20
190719T150100&playBackMode=1

四、 常见问题

以下列出几种常见问题:

1. 获取的 rtsp 的预览取流 url vlc 中播放失败

常见原因包括以下几种:
a) 设备本身不在线,可以先在平台上预览检查监控点是否在线;
b) Mgc 554 端口不通;
c) 获取取流 url 的时候未指定 expand 的值为 streamform=rtp

2. 获取的 rtmp 的预览取流 url 播放失败

常见原因包括以下几种:
a) 设备本身不在线,可以先在平台上预览检查监控点是否在线;
b) Mgc 1935 端口不通;
c) 码流的编码格式不是 h264 ,音频格式不是 aac
d) 1.2.0 的平台,在 vlc ckplayer 中播放失败的时候,需要给 mgc 打补丁。

3. 获取的 hls 的预览取流 url 播放失败

常见原因包括以下几种:
a) 设备本身不在线,可以先在平台上预览检查监控点是否在线;
b) Mgc 83 端口不通;
c) 码流的编码格式不是 h264 ,音频格式不是 aac

4. 获取的 rtsp/rtmp 的回放取流 url 播放失败

常见原因包括以下几种:
a) Mgc 的端口不通, rtsp(554)/rtmp(1935)
b) 获取的取流 url 未指定开始和停止时间等参数,
?beginTime=20190719T150000&endTime=20190719T150100&playBackMode=1
c) Rtmp 的录像码流编码格式不是 h264 ,音频格式不是 aac

5. 获取的 hls 的回放取流 url 播放失败

常见原因包括以下几种:
a) Mgc 83 端口不通;
b) 不满足条件:云存储版本要求 v2.2.4 及以上的 2.x 版本,或 v3.0.5 及以上的 3.x 版本; ISC
版本要求 v1.2.0 版本及以上,需在运管中心 - 视频联网共享中切换成启动平台内置 VOD
c) 录像码流编码格式不是 h264 ,音频格式不是 aac

6. 外网调用接口获取到的取流 url 为内网的

常见原因包括以下几种:
a) 调用接口使用的合作方的网域 ID 配置不对, vnsc 是根据合作方配置的网域 ID(domainId)
来判断取流客户端所在网域返回的取流 url 的,所以,需要获取外网的取流 url ,合作方
domainId 需要配成外网线路;
b) MGC 对应协议的多线路没有启用,导致 vnsc 找不到对应线路的 mgc 端口,返回默认线
路的取流 ip 和端口,默认端口: rtsp(554) rtmp(1935) hls(83)
<think>好的,我现在需要帮助用户验证JS_RequestInterface方法中startPlayback函数的参数是否正确传递。用户提到引用了几个代码片段,我需要先理解这些引用内容,然后找出验证参数的方法。 首先,用户提供的引用[1]中的代码示例调用了startPreview,参数包括cameraIndexCode、streamMode、transMode等,并使用JSON.stringify处理参数。这说明JS_RequestInterface通常需要将参数序列化为JSON字符串传递。引用[2]显示cameraIndexCode是组件的数据属性,可能来自父组件或用户输入。引用[3]展示了调用JS_RequestInterface的Promise用法,可能需要处理异步响应。引用[5]提到处理多个监控点时需要判断是否为数组,这可能影响参数结构。 接下来,我需要确定如何确保startPlayback的参数正确。步骤可能包括参数格式验证、数据类型检查、默认值设置、接口文档核对、日志输出、模拟调用、错误处理和联调测试。例如,检查cameraIndexCode是否为字符串,时间戳是否为数字,transMode是否为允许的协议类型。同时,确保参数结构符合接口文档要求,使用console.log输出参数对象以便调试。可能还需要使用模拟数据测试,捕获异常情况,并与其他开发人员协作验证。 用户的问题集中在参数传递是否正确,因此需要逐一检查每个参数是否符合接口要求,并确保调用方法正确。需要结合用户的代码示例,比如JSON.stringify的使用是否正确,参数名是否拼写正确,是否传递了所有必需参数。此外,查看浏览器的控制台日志可以帮助发现错误,比如参数缺失或类型错误。如果有文档,应参考文档中的参数说明,确保每个参数的值和类型都正确。如果遇到问题,可以尝试简化参数,逐步添加,以定位问题所在。</think>### 验证参数传递的步骤 #### 1. **参数格式验证** - 确保所有参数按照接口文档定义的格式传递。例如: - `cameraIndexCode` 应为字符串类型,例如:`"34020000001320000001"`[^1][^2] - `startTimeStamp/endTimeStamp` 需为数字类型的时间戳(如 `1630000000000`) - `transMode` 应限定为支持的协议类型(如 `"TCP"` 或 `"UDP"`)[^1] - 使用 `typeof` 或正则表达式验证参数类型: ```javascript if (typeof cameraIndexCode !== 'string') { console.error("cameraIndexCode 必须为字符串"); } ``` #### 2. **参数完整性检查** - 对照接口文档,确认必填参数是否全部包含。例如: ```javascript const requiredParams = ['cameraIndexCode', 'startTimeStamp', 'endTimeStamp']; requiredParams.forEach(param => { if (!paramsObj[param]) throw new Error(`缺少必要参数 ${param}`); }); ``` #### 3. **默认值与可选参数** - 若某些参数支持默认值(如 `gpuMode` 默认为 `0`),需明确设置: ```javascript const params = { cameraIndexCode: "34020000001320000001", gpuMode: gpuMode || 0, // 未传递时设为默认值 //... }; ``` #### 4. **接口文档核对** - 根据引用[1]中 `startPreview` 的调用示例,确认 `startPlayback` 的参数结构是否一致: ```javascript const JsonParam = JSON.stringify({ funcName: "startPlayback", argument: JSON.stringify({ cameraIndexCode: "34020000001320000001", startTimeStamp: 1630000000000, endTimeStamp: 1630000005000, transMode: "TCP" }) }); ``` #### 5. **日志输出验证** - 在调用前后添加日志,输出参数对象和响应结果[^1][^3]: ```javascript console.log("调用参数:", JSON.parse(JsonParam).argument); // 输出反序列化的参数 oWebControl.JS_RequestInterface(JsonParam).then(function (oData) { console.log("响应数据:", oData); }); ``` #### 6. **模拟调用测试** - 使用最小参数集测试接口可用性: ```javascript const testParams = { funcName: "startPlayback", argument: JSON.stringify({ cameraIndexCode: "TEST_001", startTimeStamp: Date.now() - 3600_000, endTimeStamp: Date.now() }) }; ``` #### 7. **错误捕获与处理** - 添加异常处理逻辑拦截参数错误: ```javascript try { oWebControl.JS_RequestInterface(JsonParam).catch(err => { console.error("接口调用失败:", err); }); } catch (e) { console.error("参数序列化错误:", e.message); } ``` #### 8. **联调验证** - 结合引用[5]的数组参数场景,若涉及多监控点回放,需验证参数是否为数组格式: ```javascript if (Array.isArray(cameraIndexCode)) { // 批量处理逻辑 } ``` --- ### 参数检查对照表 | 参数名 | 类型 | 是否必填 | 示例值 | 校验规则 | |------------------|------------|----------|----------------------|--------------------------| | `cameraIndexCode`| string | 是 | "34020000001320000001" | 长度18-32位字母数字组合 | | `startTimeStamp` | number | 是 | 1630000000000 | 13位Unix时间戳 | | `transMode` | string | 否 | "TCP" | 枚举值:TCP/UDP/HTTP | | `gpuMode` | number | 否 | 1 | 0(关闭)或1(开启) | --- ### 关键验证方法总结 1. **控制台日志分析**:通过浏览器开发者工具检查参数是否完整传递[^3] 2. **接口模拟工具**:使用Postman或curl模拟请求,隔离前端代码影响 3. **参数校验中间件**:在后端接口层添加参数验证逻辑,返回详细错误码 4. **单元测试覆盖**:编写Jest测试用例验证参数组合的合法性 若发现 `recordLocation` 参数无效,需检查是否要求为特定格式(如经纬度字符串 `"31.23,121.47"`)[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值