更新记录

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:支持 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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插件)

如需加功能,定制化开发也可以联系作者!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

读写权限 抓图和录制视频需要 : <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 录音需要的权限:<uses-permission android:name="android.permission.RECORD_AUDIO"/>

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件使用的 海康 SDK 会采集数据,详情可参考:https://open.hikvision.com/

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问