撸猫神器 uIPCat!让闲置手机作为边缘视觉计算终端

17 天前
 uIPC

背景

本人是一个搞嵌入式软件开发的铲屎官,外出时经常有远程撸猫的需求,之前尝试过各种市面上的网络摄像头,但大部分摄像头画质跟手机的比起来说还是有很大的差距,并且把一个摄像头放在家里也让人没有那么安全感。

现有产品

在一次冲浪过程中发现了有不少让手机充当网络摄像头的 APP ,刚好自己有一台闲置的 iPhone SE1 。试玩了一圈此类 APP , 大部分只能局域网内实时预览,比较成熟商业化的是一个台湾公司做的阿福管家,但在大陆使用延时和稳定性还是比较一般,并且免费使用的限制太多了,最终得到的画面可能还不如原来的网络摄像头。

实现

在各种的限制下,我就尝试自己开发一个,自己没客户端开发背景,自己有过 WebRTC 底层的调试移植开发经历,略懂上层的 JavaScript WebRTC 应用接口的。如果是基于客户端开发,有多个平台需要兼容,这学习成本有点高,搞不来。

于是我选中一个天生为跨平台而生的方案:Web APP

用浏览器去实现在一个 IPCamera 功能对应的技术栈如下:

  1. 实时预览:原生支持 WebRTC ,省掉流媒体接口和 P2P ICE 的开发调试
  2. 本地存储:基于 IndexedDB 做大容量视频存储
  3. 云端储存:很方便实现第三方对象云存储
  4. 本地 CV:基于 TensorFlow.js ,在浏览器端就可以实现对象识别录像和报警
  5. 端到端加密:借助 URI fragment 特性可实现本地密钥生成,无需经过服务端传输和存储

最终实现效果:https://uipcat.com/

实时视频流预览:

当然,也可以用来摸鱼:

只需要扫码即刻部署:

如何使用

无需注册,在主预览设备打开 https://uipcat.com/,用手机扫码即可作为摄像头节点,保存预览设备跳转到的 URL 作为访问摄像头的唯一权限。

本地 CV

市场上大部分的网络摄像头产品提供了对象侦测功能,但他们的实现基本是需要将图片传到厂家服务端上识别。手机主芯片的算力是远超网络摄像头芯片,所以可以在直接在手机浏览器本地拍对象侦测模型。uIPCat 在本地默认集成了 MediaPipe 的通用对象侦测模型,可以满足绝大部分识别任务,后续开加上自定义模型,部署自己训练的模型,定制识别自己关注的对象。

在对象识别的前置,加了一个画面变化侦测,如有画面变化超过了定义的阈值,才会触发识别处理。

目前开放了绝大部分参数的自定义,后面会简化这个配置。

视频存储

目前默认使用本地存储,数据会被存储在本地浏览器的 IndexedDB ,它本不是完全可靠的存储方案,各浏览器有些许差异。云存储适配了 AList v3 的 API 接口,可以通过 AList 将数据间接存到各个主流的如 S3 等主流储存或云盘方案,支持的存储列表

HomeKit 支持

通过 go2rtc 开源项目接入 HomeKit 平台,该功能目前正在测试中,后续开放。

隐私安全

对于大部分人来说,隐私安全是一个网络摄像头的重中之重。现有市面上的网络摄像头设备,你的隐私安全大部分是基于你对品牌厂家的信任,从实现的技术角度上说,他们是有权限可以直接访问你的摄像头,更别说大部分厂家提供了云存储直接分析处理识别你图片或视频的服务。

uIPCat 基于 WebRTC 链路本身就是基于 DTLS 和 SRTP 加密标准了,重点在于保障信令的安全。uIPCat 信令采用端到端加密方案,在主预览设备本地生成密钥,加密方法 AES-GCM ,密钥附带到 URI fragment 通过二维码线下传输到摄像头节点,加密后的信令数据通过 MQTT 通道传输。

URI fragment 既上图 # 号后字段,它不会传递给服务器端。

开发计划

4767 次点击
所在节点    分享创造
72 条回复
chancat
17 天前
我用阿福管家
swordspoet
17 天前
厉害了
Michelangelono
16 天前
可以搞个大屏视图,就是一个界面同时显示多个监控画面
brianinzz
16 天前
厉害!
Admstor
16 天前
手机扫描二维码后
打开的网页
手机也是一片黑,PC 也停留在二维码,貌似没有任何用
gosby
16 天前
马赛克砖块儿好像用的是 UTC 时间比实际会慢 8 个小时
stefwoo
15 天前
长期插电怕鼓包,可以把电池改成大电容,我改过一个。
uIPC
15 天前
@Michelangelono 嗯嗯,这个计划搞,类似虚拟 NVR 。
uIPC
15 天前
@stefwoo 是的,淘宝有那个去掉电池的电芯 ic 可以换。
uIPC
15 天前
@gosby 这个是热力图组件的一个 bug ,设置时区不生效,我关注下。
uIPC
15 天前
@wuzzispacelake 如果手机充电本身不发热,其实也还好,各有各的应用场景吧,你可以当作软路由和硬路由的区别。
CharlesRey
15 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂![IMG_4840.JPG]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
CharlesRey
15 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂![]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
CharlesRey
15 天前
或许是我这个手机太旧了,并不支持😂😂😂😂😂😂[]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
stefwoo
15 天前
nokia 。哈哈哈哈。
uIPC
15 天前
@CharlesRey 牛逼,可以装 chrome 吗?至少是浏览器支持了 WebRTC 才可以,目前主流的都支持。
Xushet
14 天前
@BQsummer #15 手机设置智能断充就好了
midpoint
14 天前
很有意思,不错的想法
stonesirsir
13 天前
@BQsummer 这个确实也算一个问题
52lvqiang
12 天前
非常棒,感谢分享!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1049594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX