更新记录
3.0(2022-01-21)
新增回放功能
项目升级为kotlin
1.2(2021-12-13)
开放视频声音接口 详情看适用文档 快速搜索 enableSound
1.1.1(2021-10-15)
应uni端小姐姐要求移除插件本身的权限检测,改由uni端进行检查
优化代码细节
查看更多平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:7.0 - 11.0 | armeabi-v7a:支持,arm64-v8a:未测试,x86:支持 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
AD-HikVideoModule
海康视频SDK,由于本人只是Android开发,所以只有Android版本的实时视频预览,视频回放,语言对讲(未开放)。
插件测试背景:云台是海康云台,摄像头不全都是海康,所以根据国标进行了对接转换,才有有两个相机code,有一个是用于对接海康云台cameraIndexCode(获取流链接之类的),一个是用于控制相机特殊功能如雨刷透雾等的国标cameraCode,两个code后台进行了相应的处理,至于各位测试的时候cameraCode不传是没有任何问题的。后文中所有请求地址都是后端对接海康云台转换过的地址。
使用须知:由于该插件是自己项目适配的,没有做成便利性可拓展性强的版本,所以购买前请仔细阅读本文档,看是否符合自己需求,不符合可联系作者定制化开发,联系方式在本文最后面。
引入插件
var testModule = uni.requireNativePlugin("Hik-Video-Module");
调用
调用插件: (ps:1.1版本已移除此方法中的监听回调)
testModule.gotoPreviewActivity({
'previewUri':this.previewUri,
'canControl':this.control,
'canRecord':this.canRecord,
'cameraCode':this.cameraCode,
'enableSound':this.enableSound
})
插件销毁通知回调:
testModule.addClosePluginListener((ret)=>{
console.log('监听到了状态变化 --- ', ret.msg)
})
喊话(录音)保存地址回调:(不实现这个方法就没有相应的按钮图标)
testModule.addRecordEventListener((ret)=>{
console.log('监听到了状态变化 --- ', ret.path)
})
相关代码
<template>
<view class="container">
previewUri<input v-model="previewUri" placeholder="点击编辑视频URL" >
<br>
control<input v-model="control" placeholder="是否控制云台(true/false)" >
<br>
cameraIndexCode<input v-model="cameraIndexCode" placeholder="点击编辑相机海康IndexCode(重连需要) 播放,获取流连接" >
<br>
<br>
cameraCode<input v-model="cameraCode" placeholder="点击编辑相机国标code(用于摄像头控制)" >
<br>
<br>
enableSound<input v-model="enableSound" placeholder="是否开启声音(true/false)" >
<br>
<button type="default" @click="test">提交</button>
<view>{{previewUri}}</view>
<view>{{control}}</view>
<view>{{cameraCode}}</view>
<!-- <view>{{ result }}</view> -->
</view>
</template>
<script>
var testModule = uni.requireNativePlugin("Hik-Video-Module");
export default {
data() {
return {
previewUri:"",
control:true,
canRecord:true,
enableSound:false,
cameraCode:"",
result:"return msg",
}
},
onLoad() {
this.addRecordListener();
this.addClosePluginListener();
},
onUnload() {
console.log('ddd');
},
methods: {
test(){
testModule.gotoPreviewActivity({
'previewUri':this.previewUri,
'canControl':this.control,
'canRecord':this.canRecord,
'cameraIndexCode':this.cameraIndexCode,
'cameraCode':this.cameraCode,
'enableSound':this.enableSound
})
},
addRecordListener(){
testModule.addRecordEventListener((ret)=>{
console.log('监听到了状态变化 --- ', ret.path)
})
},
addClosePluginListener(){
testModule.addClosePluginListener((ret)=>{
console.log('监听到了状态变化 --- ', ret.msg)
})
}
}
}
</script>
API
gotoPreviewActivity() : 参数 -> (*) 为必传
* previewUri:前端直接传入URL 进入就直接播放,不给就需要本地获取(测试时建议填写)。播放失败就进行三次重连,
* cameraIndexCode: 重连需要的相机参数,根据相机参数去获取的视频流地址。
cameraCode: 用于控制相机雨刷透雾等功能的国标code。
canControl: 是否显示控制按钮,canControl == false ,录音按钮也不会显示
canRecord : 是否显示录音按钮
enableSound: 是否开始视频声音,false关闭 true开启 默认是关闭的
transMode: 网络协议 0-UDP,1-TCP 默认为0
addRecordEventListener()
添加录音监听回调事件,返回值为语音存储位置。
addClosePluginListener()
插件销毁监听回调
注意事项
1 在manifest中选择插件Hik-Video-Module,然后配置相应参数
因为插件里面进行了摄像机操作,重连,请求回放地址等调用接口,这就产生一个问题:插件要解析接口返回的数据,所以需要后台按照以下规则返回数据结构,插件才能完美运行。
标绿的是你配置的地址,蓝色的是你传参传过来的字段,其余的是默认写死的参数。
控制摄像头转动放大缩小的接口
控制摄像头进行转动等相应操作 , 链接地址:cameraControlUrl :http://xxxxxx 参数如下(都是在插件里面已经配置好的)
插件代码:
HttpTools.okHttpGet(cameraControlUrl + "?action=" + action +
"&code=" + cameraCode + "&command=" + command +
"&speed=" + cameraSpeed);
Request URL:
cameraControlUrl?action=0&code=cameraIndexCode&command=UP&speed=50
Response:
{
"code": "20000",
"message": "成功",
"data": null
}
PS:这个接口Response无要求,只要对应Request URL
重新请求直播流接口
获取视频流URL接口
ControlUrl: http://xxxxxx?protocol=rtsp //本项目最开始传入的URL地址会在几分钟后失效,如果用户在此期间切出APP后在进入就需要重连(默认3次),重新获取URL。
protocol这个参数直接配置在链接上,建议写rtsp,当然根据自己业务修改,链接加 ? 拼接。
插件代码:
HttpTools.okHttpGet(ControlUrl + + "&code=" + cameraIndexCode + "&transMode=" + transMode)
这里注意,transMode (0-UDP,1-TCP) 不传默认是0
Request URL:
ControlUrl&code=cameraIndexCode&transMode=transMode
Response:
{
"code": "20000",
"message": "成功",
"data": {
"url": "这是一个连接地址"
}
}
获取视频回放流接口
获取rtsp回放流的链接地址 http://xxxxxx?streamform=ps 因为请求返回的必传参数较多,就直接看插件中的代码吧
插件代码:
HttpTools.okHttpGet(reAcquireBackUrl + "&code=" + cameraIndexCode + "&beginTime=" +
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(startTime) + "&endTime=" +
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(endTime)
Request URL:
reAcquireBackUrl?&code=cameraIndexCode&beginTime=2022-04-12T00:00:00.217Z&endTime=2022-04-12T23:59:59.999Z
Response:
{
"code": "20000",
"message": "成功",
"data": {
"list": [{
"size": 142290944,
"beginTime": "2022-04-12T00:00:00.000+08:00",
"endTime": "2022-04-12T16:30:33.000+08:00",
"lockType": 3
}],
"uuid": "",
"url": "这是一个回放视频流地址"
}
}
海康androidSDK中想要回放正常streamform=ps必传,这里直接就放到配置的url地址后面了。 startTime ,endTime初始值是当前的0点到当前的时间。后面滑动时间条之后会根据时间条的时间前后推12个小时作为startTime,endTime。
举例
Request URL:
cameraControlUrl?action=0&code=cameraIndexCode&command=UP&speed=50
后端需要匹配 action code command speed 这个几个参数,然后根据这几个参数去调用hik的接口达到控制相机的相关。简单来说就是需要后台做一下转发,可能海康部分接口参数会很多,插件里面没调用的后台转发的时候加上就行。
由于每个项目公司间接口规则不一致,可能需要修改Android源码,但是如果是遵循海康相机控制接口规则(详情可参考:https://open.hikvision.com/ ),那么就配置后就能使用插件。
常见问题汇总
1 抓图或录像无效
请检查是否给APP读写权限
2 录音无效
请检查是否给APP读写权限
3 录音无法在喇叭上播放
录制音频的格式为MPEG_4 ,编码 AAC,在手机上是能正常播放的,可能会遇到某些要求特定的采样率、 比特率的喇叭导致无法播放。基本是转码库的问题。
4 自行对接SDK发现回放一直在当前时间的问题
海康官网20210924 SDK及以前的版本有BUG,作者这个是和海康开发人员联调了好久才解决正常的海康SDK包。 这个bug是只有使用了国标的对接才会出现的bug,全是海康设备在20210924这个版本以前不会有问题的。如果海康最新的SDK已经超过这个版本,那么就是问题已经修复了的。
5 无效URL
插件配置的url没有填写完全,在HB的app原生插件配置里面填写好就行。
5 没有cameraCode
前文已经说明cameraCode的作用(hik的cameraIndexCode只适用hik的摄像机,其他厂商的不支持 为了对适配市面上所有相机操作才有这个转换)。
简单来说,在海康层次:cameraCode就cameraIndexCode单独做了一次封装,实际还是cameraIndexCode。如果只有hik不想去做转换,cameraCode和cameraIndexCode填写一样就行。
后记
讲道理,不配置其他参数的情况下只要previewUri正确就能获取到视频画面。
个别客户反馈有没有实时语音对讲功能,这里做回复本插件有,只是没有对外开放,因为作者没有相应的测试环境,无法测试。
当然也欢迎各位在使用插件过程中有好的建议或者发现bug及时反馈给作者。再次感谢!
上传的有完整的UNIdemo,请下载体验,如有问题,请联系作者QQ:43229097(备注HIK插件)。