Unity 接入海康摄像头(WebGL,PC),避坑专用
介绍:项目需要,接入海康威视摄像头云台。应用场景:Unity开发某个物流园区的数字孪生系统,在3D场景中点击监控摄像头图标,弹框播放现场的摄像头画面。
准备:Unity2023.3.0a14、海康威视设备、OpenAPI安全认证库(C#) V1.0.1、AVProVideo、Postman等
说明:
Unity版本:用WebGPU提升场景和整体渲染效果,至于Unity2023设置WebGPU相关内容可去官网查看,在Unity6.0版本将推出该设置选项
OpenAPI 安全认证库:海康接口都需要进行安全认证才可正常访问,可在海康开放平台下载(有坑,后续介绍)
AVProVideo:视频流播放插件(PC的话也可用UMP替换,但UMP发布WebGL有报错)
正文:
1.线下园区安装好海康威视设备会给每台设备一个唯一的设备标(CameraIndexCode)Unity端会用到这个ID去请求接口,保持设备正常运行,在内网部署设备管理后台,负责与前端进行交互请求,这个海康那边会安排专业人员协助。
2.Unity端事项:
1)导入OpenAPI认证库(C#),该库海康已经封装了基于HTTP的POST和GET请求。以及设置平台信息的接口SetPlatformInfo接口。在HttpUtil脚本内,该类还提供了AK和SK生成签名的相关接口。
SetPlatformInfo:
InitHttpRequest:
Get:
Post:
注意!!!以上接口由海康提供,可支持非WebGL端项目开发(坑1)。楼主当时也是完全用该接口完成接入,验证编辑器下和发布PC端应用都可以正常使用。在发布WebGL时,点击事件直接卡死!!!吐槽:Unity发布WebGL的坑太多,开发要走的路远远不止当下。后续解读源码发现该问题其实在另一个地方就遇到了!
原因(重点):WebGL不支持IO操作,注意System.IO相关接口。
通常读取StreamingAssets文件夹下文件会用File.ReadAllTxt()等接口,在WebGL该接口不可用需要用WWW或UnityWebRequest下载读取。
解决办法:
分析海康Get接口和Post接口,代码块用到Stream和StreamReader两个API,这就导致在WebGL端Http请求时,直接卡死的原因,咱们找到原因得想法解决,在深层次分析原因是HttpWebRequest这个API导致得,这里咱们可以用UnityWebRequest这个API去重写Post和Get方法。相关核心代码如下:
InitRequest:
Get:
Post:
获取监控设备推流地址(POST_GetCameraUrl):camCode:设备编码,唯一标识
跨域请求(坑2):
到此我们发布WebGL测试,点击事件不再出现卡死现象。但接着F12查看日志,发现又一个问题,WebGL上Http请求跨域的问题,这个问题导致的原因是由于发布部署到本地nginx服务上。而Http请求的接口地址是在另一个域名下,查看网上各种解决跨域问题办法,楼主最后没解决,也是困扰了很多天。有的文章说需要服务器端配置;有的是需要nginx配置;有点百家讲坛了。我最后是直接把WebGL部署到服务器一个域名下的。这样就可以正常请求获取推流地址并在Unity端用AVProVideo进行播放实实监控画面了。
AVProVideo在WebGL平台设置:
Unity:
总结:每一份耕耘都有一定收获,WebGL的坑源源不止。希望Unity数字孪生系统希望未来有一套成熟的解决方案,兼容各个平台。本项目在WebGL端场景渲染这块也砍了很多刀才能流畅的运行(FPS>60),最后上个项目截图:
资源分享:WebGL平台基于AVProVideo播放海康设备监控实实画面demo源码。
以上内容会分享在以下Demo中。源码下载地址
版权归原作者 禅 無 所有, 如有侵权,请联系我们删除。