撸猫神器 uIPCat!让闲置手机作为边缘视觉计算终端 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
uIPC
V2EX    分享创造

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

  •  25
     
  •   uIPC 2024-06-14 16:13:21 +08:00 10694 次点击
    这是一个创建于 484 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

    现有产品

    在一次冲浪过程中发现了有不少让手机充当网络摄像头的 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/

    实时视频流预览: image

    当然,也可以用来摸鱼: image

    只需要扫码即刻部署: image

    如何使用

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

    本地 CV

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

    image

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

    image

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

    视频存储

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

    HomeKit 支持

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

    隐私安全

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

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

    image

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

    开发计划

    • 接入 Home Assistant ,通过自定义 MQTT 推送对象侦测报警
    • 开放设备接入 SDK ,可自行接入如树莓派、ESP32 等 DIY 设备。
    • 开放摄像头节点 API 能力,作为多模态大模型的前置边缘视觉处理器(正如标题党那样)
    • 自定义模型,提供在线模型训练方法
    • 更多类型的云存储 API 接入
    第 1 条附言    2024-06-14 17:57:15 +08:00

    在 Settings 可以设置选择摄像头: image

    75 条回复    2025-04-25 08:03:37 +08:00
    wensonsmith
        1
    wensonsmith  
       2024-06-14 16:26:19 +08:00
    666, 不错的项目啊
    shyrock
        2
    shyrock  
       2024-06-14 16:30:48 +08:00
    感兴趣。
    Ericality
        3
    Ericality  
       2024-06-14 16:31:20 +08:00
    耳目一新的感觉 马一下回家试试
    R4rvZ6agNVWr56V0
        4
    R4rvZ6agNVWr56V0  
       2024-06-14 16:35:13 +08:00
    非常可以
    dapang1221
        5
    dapang1221  
       2024-06-14 16:37:09 +08:00
    太强了,一堆旧手机有用了
    forvvvv123
        6
    forvvvv123  
       2024-06-14 16:40:13 +08:00
    nb 啊
    Ziuc
        7
    Ziuc  
       2024-06-14 16:41:04 +08:00
    很强,学习了
    uIPC
        8
    uIPC  
    OP
       2024-06-14 16:43:01 +08:00
    感谢各位大佬支持,之前一直是自用,首次公开放出来,欢迎大家试用多提意见。
    moonbeama
        9
    moonbeama  
       2024-06-14 16:50:31 +08:00
    只能使用前置摄像头吗?
    uIPC
        10
    uIPC  
    OP
       2024-06-14 16:52:40 +08:00
    @moonbeama 在 Settings 里可以改变摄像头
    amber0317
        11
    amber0317  
       2024-06-14 17:12:23 +08:00
    技术很强,完成度也很高,支持一波
    Yukineko
        12
    Yukineko  
       2024-06-14 17:16:06 +08:00
    不错噢,之前也有想法训练个模型通过摄像头识别猫是否在喝水/吃饭
    outcastveron
        13
    outcastveron  
       2024-06-14 17:16:46 +08:00
    非常 nb 的项目,支持!!
    jazz1988
        14
    jazz1988  
       2024-06-14 17:18:19 +08:00
    厉害,非常棒
    BQsummer
        15
    BQsummer  
       2024-06-14 17:19:44 +08:00
    手机长时间插电源会不会鼓包完全看人品
    cincout
        16
    cincout  
       2024-06-14 17:21:22 +08:00
    太厉害了
    uIPC
        17
    uIPC  
    OP
       2024-06-14 17:26:38 +08:00
    @Yukineko 完全可以!如果直接扔到多模态大模型里,甚至都可以不用训练专用模型,猫是否在睡觉,吃东西还是拉翔,都可以直接高识别率识别出来,配合 Home Assistant 可以做很多原来难以实现的智能家居场景联动。
    shyling
        18
    shyling  
       2024-06-14 17:28:34 +08:00
    有点东西!
    7gugu
        19
    7gugu  
       2024-06-14 17:31:04 +08:00
    有点牛逼,下班试试看
    uIPC
        20
    uIPC  
    OP
       2024-06-14 17:31:07 +08:00
    @BQsummer 是的,发热是导致鼓包主要原因,我花了很多时间优化本地 CV 发热问题,现在已经好很多了。如果不开本地画面侦测,CPU 占用极低,基本只需要维持一路 MQTT 在线就好了,摄像头不工作时可以处于休眠状态。
    duffercn
        21
    duffercn  
       2024-06-14 17:38:27 +08:00
    这个太酷了!
    Jesmora
        22
    Jesmora  
       2024-06-14 17:48:08 +08:00
    我比较笨,iOS 如何切换到后置摄像头
    fenghao0108
        23
    fenghao0108  
       2024-06-14 17:48:31 +08:00
    这方案吊炸天啊
    uIPC
        24
    uIPC  
    OP
       2024-06-14 17:52:10 +08:00
    @Jesmora 哈,是我体验没做好,在 Settings 可以设置选择摄像头,我后面优化下这个设置的位置。
    povsister
        25
    povsister  
       2024-06-14 18:05:08 +08:00 via iPhone
    厉害,抽空研究看看
    yinghu183
        26
    yinghu183  
       2024-06-14 18:30:07 +08:00 via iPhone
    牛逼的项目,期待接入 homeassistant 。
    PqgpNgA0wk
        27
    PqgpNgA0wk  
       2024-06-14 18:30:34 +08:00
    感觉这个项目已经做的挺全,还有 us 链路
    uIPC
        28
    uIPC  
    OP
       2024-06-14 18:40:33 +08:00
    @PqgpNgA0wk 部署了中国区和美国区两个 MQTT 信令节点,还两个 coturn P2P 打洞和 TURN 中继节点。
    uIPC
        29
    uIPC  
    OP
       2024-06-14 18:41:49 +08:00   1
    @yinghu183 已经在开发了,我自己也是重度的 homeassistant 用户,一定会支持好的。
    XMV2e4PmK5F85h17
        30
    XMV2e4PmK5F85h17  
       2024-06-14 18:47:21 +08:00
    一个手机扫码后 可以看到画面了 但是没有看到 setting 在哪里 另外 怎么用另外一个手机查看呢
    1044523901
        31
    1044523901  
       2024-06-14 18:50:12 +08:00
    蹲开源
    ixwen
        32
    ixwen  
       2024-06-14 18:51:08 +08:00
    @uIPC #24 这个感觉放在首页 切换主体旁边会方便点
    XMV2e4PmK5F85h17
        33
    XMV2e4PmK5F85h17  
       2024-06-14 18:52:01 +08:00
    好像有点问题 另外一个手机查看的时候 看不到画面
    uIPC
        34
    uIPC  
    OP
       2024-06-14 19:53:23 +08:00
    @Sniper000 在预览端设置,摄像头节点扫完码就可以不用动了,设置都在另外一个手机完成的。
    uIPC
        35
    uIPC  
    OP
       2024-06-14 19:55:18 +08:00
    @1044523901 会先开源设备接入 SDK ,主站的前端是我现学现用的,后面代码成熟见得了人了可以考虑开源。
    uIPC
        36
    uIPC  
    OP
       2024-06-14 19:58:28 +08:00
    @ixwen 好主意,我看下怎么比较好的放到主页,现在控制栏被按钮占满了,原来是在那里的。
    uIPC
        37
    uIPC  
    OP
       2024-06-14 19:59:42 +08:00
    @Sniper000 正常是支持多设备同时看一个摄像头节点的,你方便把浏览器版本信息发我下吗?我看下测下是不是兼容问题。
    slowman
        38
    slowman  
       2024-06-14 20:04:12 +08:00
    神了
    lucifer9
        39
    lucifer9  
       2024-06-14 20:32:39 +08:00
    主要问题还是手机不好固定啊
    尤其是要兼顾视角和充电的位置
    07aPzknB16ui9Cp3
        40
    07aPzknB16ui9Cp3  
       2024-06-14 20:42:38 +08:00
    手机当监控最大的问题是过热,所以还是得上专门的摄像头
    chancat
        41
    chancat  
       2024-06-14 22:50:34 +08:00 via Android
    我用阿福管家
    swordspoet
        42
    swordspoet  
       2024-06-14 23:40:04 +08:00
    厉害了
    Michelangelono
        43
    Michelangelono  
       2024-06-15 09:37:51 +08:00
    可以搞个大屏视图,就是一个界面同时显示多个监控画面
    brianinzz
        44
    brianinzz  
       2024-06-15 15:07:29 +08:00
    厉害!
    Admstor
        45
    Admstor  
       2024-06-15 16:05:07 +08:00
    手机扫描二维码后
    打开的网页
    手机也是一片黑,PC 也停留在二维码,貌似没有任何用
    gosby
        46
    gosby  
       2024-06-15 19:05:35 +08:00 via Android
    马赛克砖块儿好像用的是 UTC 时间比实际会慢 8 个小时
    stefwoo
        47
    stefwoo  
       2024-06-16 09:22:52 +08:00 via Android
    长期插电怕鼓包,可以把电池改成大电容,我改过一个。
    uIPC
        48
    uIPC  
    OP
       2024-06-16 16:00:08 +08:00
    @Michelangelono 嗯嗯,这个计划搞,类似虚拟 NVR 。
    uIPC
        49
    uIPC  
    OP
       2024-06-16 16:01:02 +08:00
    @stefwoo 是的,淘宝有那个去掉电池的电芯 ic 可以换。
    uIPC
        50
    uIPC  
    OP
       2024-06-16 16:03:25 +08:00
    @gosby 这个是热力图组件的一个 bug ,设置时区不生效,我关注下。
    uIPC
        51
    uIPC  
    OP
       2024-06-16 16:05:07 +08:00
    @wuzzispacelake 如果手机充电本身不发热,其实也还好,各有各的应用场景吧,你可以当作软路由和硬路由的区别。
    CharlesRey
        52
    CharlesRey  
       2024-06-16 17:10:34 +08:00
    或许是我这个手机太旧了,并不支持![IMG_4840.JPG]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
    CharlesRey
        53
    CharlesRey  
       2024-06-16 17:10:54 +08:00
    或许是我这个手机太旧了,并不支持![]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
    CharlesRey
        54
    CharlesRey  
       2024-06-16 17:11:17 +08:00
    或许是我这个手机太旧了,并不支持[]( https://p0.meituan.net/dpplatform/3a2f60d206a28538b7a54290cf4a89c07091115.jpg)
    stefwoo
        55
    stefwoo  
       2024-06-16 17:15:05 +08:00 via Android
    nokia 。哈哈哈哈。
    uIPC
        56
    uIPC  
    OP
       2024-06-16 17:54:18 +08:00
    @CharlesRey 牛逼,可以装 chrome 吗?至少是浏览器支持了 WebRTC 才可以,目前主流的都支持。
    Xushet
        57
    Xushet  
       2024-06-17 09:31:20 +08:00
    @BQsummer #15 手机设置智能断充就好了
    midpoint
        58
    midpoint  
       2024-06-17 13:16:15 +08:00
    很有意思,不错的想法
    stonesirsir
        59
    stonesirsir  
       2024-06-18 17:11:54 +08:00
    @BQsummer 这个确实也算一个问题
    52lvqiang
        60
    52lvqiang  
       2024-06-19 16:32:54 +08:00
    非常棒,感谢分享!
    stefwoo
        61
    stefwoo  
       2024-06-22 15:58:30 +08:00 via Android
    node 可以息屏吗?目前我只要息屏,浏览器就停止工作了。
    stefwoo
        62
    stefwoo  
       2024-06-22 16:16:39 +08:00 via Android
    我还有一个旧手机报错,系统是安卓 4.4 ,浏览器是 chrome 。

    500
    b.replaceAll is not a function

    @uIPC
    uIPC
        63
    uIPC  
    OP
       2024-06-22 16:26:46 +08:00
    @stefwoo hi
    #62 安卓在 5.0 之后才开始支持 WebRTC ,所以 4.4 无法原生支持。
    #61 绝大部分的手机在息屏时会直接把摄像头硬件级别的休眠了,所以只能尝试把屏幕亮度降到最低保持常亮。
    stefwoo
        64
    stefwoo  
       2024-06-22 16:54:13 +08:00 via Android
    @uIPC 哦。
    那太容易烧屏了。
    Fred0410
        65
    Fred0410  
       2024-06-23 02:47:49 +08:00
    @CharlesRey 诺基亚都出来了,6
    nowtg
        66
    nowtg  
       2024-06-24 09:19:16 +08:00 via iPhone
    @uIPC #63 replaceAll 不存在 加个 polyfill 应该就可以吧
    simo
        67
    simo  
       2024-06-24 10:37:20 +08:00
    这个牛啊
    johnwonderful
        68
    johnwonderful  
       2024-06-24 13:12:46 +08:00
    这么厉害,有空试试
    zyhedwards
        69
    zyhedwards  
       2024-06-28 13:31:10 +08:00
    @uIPC 部署 mqtt 节点需要费用吗?成本大概多少
    uIPC
        70
    uIPC  
    OP
       2024-06-28 14:20:29 +08:00
    @zyhedwards 需要的,如果连接数在 1000 以下,国内的那种 99 元一年的小机就够了。
    zyhedwards
        71
    zyhedwards  
       2024-06-28 14:57:14 +08:00
    @uIPC 感谢解答。 成功打洞获取节点数据后,后续是不是就走 P2P 了?这样看其实带宽流量成本也不是很高?
    uIPC
        72
    uIPC  
    OP
       2024-06-29 11:46:22 +08:00
    @zyhedwards #71 网络类型的不同,P2P 有一定的打通失败率,这时候就需要 TURN 中继,但如果能打得通,就不需要服务端有流量成本了。
    opopoipipip
        73
    opopoipipip  
       2024-10-09 18:36:22 +08:00
    这个厉害,支持!
    chancat
        74
    chancat  
       169 天前 via Android
    今天回来看看了...emm 我的浏览器无论手机还是 pc,出于安全和隐私和防止某无良 b 网站偷跑 pcdn,必禁用 webrtc
    chancat
        75
    chancat  
       169 天前 via Android
    @chancat 还有禁用 quic 直接路由规则拉入黑洞
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     924 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 19:15 PVG 03:15 LAX 12:15 JFK 15:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86