资讯详情

ESP32 iPhone Agent 的“眼睛“:AirPlay + UxPlay 屏幕镜像把 iPhone 画面变成 JPEG 帧的完整链路

📅 2026/10/16 5:42:24 | 华诺云谱 👁 阅读
ESP32 iPhone Agent 的“眼睛“:AirPlay + UxPlay 屏幕镜像把 iPhone 画面变成 JPEG 帧的完整链路
【免费下载链接】esp32-iphone-agentLet an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak.项目地址https://gitcode.com/gh_mirrors/es/esp32-iphone-agent点击查看免费下载ESP32 iPhone Agent 用AirPlay 屏幕镜像 UxPlay接收 iPhone 屏幕再经 GStreamer 流水线编码为JPEG 帧让 AI 视觉模型能看见手机画面。本文拆解这条从iPhone 屏幕到JPEG 帧的完整链路每个环节做了什么、帧是如何被抓取的以及 AI Agent 和 Web 页面如何消费这些帧。不需要 Mac、不需要开发者账号、不需要采集卡——这条眼睛链路完全跑在一台普通 macOS / Linux 电脑上。链路全景iPhone 屏幕 → AirPlay → UxPlay → JPEG 管道整条链路可以分为 5 个环节环节角色做什么① 屏幕广播iPhone控制中心 → 屏幕镜像把电脑当成投屏设备用 AirPlay 协议推屏幕② AirPlay 接收UxPlay接收 iPhone 编码的屏幕视频交给 GStreamer③ JPEG 编码GStreamer 流水线videoratejpegenc降到 8 fps逐帧压缩成 JPEG④ 帧抓取Screen类server/hidagent/screen.py从字节流里切出一帧帧完整 JPEG只保留最新一帧⑤ 帧消费Agent / Web UI模型行动前截图Web 页面刷新实时画面值得强调的是整条眼睛链路的核心源码就是一个约 120 行的Screen类位于 server/hidagent/screen.py下面按环节展开。第一步UxPlay 扮演 AirPlay 接收器在 iPhone 上打开控制中心 → 屏幕镜像会看到一个名为iPhone Agent的接收器——这就是 UxPlay 在局域网内通过 mDNS 广播出来的名字可用环境变量AIRPLAY_NAME自定义见 README.md 配置表。服务端把 UxPlay 作为子进程启动关键参数如下见 screen.py 的 _supervise-n 名字接收器名称即手机镜像列表里显示的名字-vs GStreamer sink把解码后的视频流直接送入自定义的 GStreamer 编码流水线下一步讲其余参数关闭音频等无关输出保持链路轻量还有一个工程细节UxPlay 在部分断连场景下会直接退出所以Screen用一个监督循环守护它——进程一旦退出就自动重启眼睛断线后能自愈。第二步GStreamer 流水线把视频流压成JPEG 连续流UxPlay 的-vs参数收到的是一条 GStreamer 元素链videorate drop-onlytrue ! video/x-raw,framerate8/1 ! jpegenc quality75 ! fdsink fdN逐个拆开看videorate drop-onlytrueframerate8/1不复制帧、只丢弃帧把视频降到 8 fps——AI 看图不需要 60 fps这是刻意的带宽与 CPU 优化jpegenc quality75把每一帧压成 JPEG质量 75 是清晰度和体积的折中fps/quality都是 Screen 构造函数 可调参数fdsink fdN编码结果不写磁盘而是直接写进一个os.pipe()管道的写端用管道而不是临时文件意味着零落盘编码完的 JPEG 直接流过内存进入 Python 进程。第三步从字节流里切出 JPEG 帧管道里是一整条连续字节流如何知道一帧从哪里开始、在哪里结束JPEG 格式自带两个固定标记\xff\xd8SOIstart of image帧的开头\xff\xd9EOIend of image帧的结尾screen.py 的 _read 循环读取管道每次拿到 64 KB然后扫描这两个标记每找到一对SOI…EOI就是一帧完整 JPEG立即覆盖self.frame并刷新updated时间戳。整个系统任何时刻只需要最新一帧旧帧直接丢弃内存占用恒定。另外aspect 属性 直接从 JPEG 头部的 SOF 标记\xff\xc0格式里内嵌了宽高字段读出画幅比例无需额外解码图像——Web 页面上实时画面的点击坐标换算成手机屏幕坐标就靠它。帧的三种感知live、settled、freshAirPlay 有个关键特性屏幕不变时不发送任何帧。这个懒惰被系统变成了特性属性 / 方法作用live判断屏幕是否在线进程存活 有帧 Linux 上UxPlay 仍有已建立的 TCP 连接macOS 上退化为90 秒内有过新帧settled()等画面静止连续 0.35 秒没有新帧就返回最多等 4 秒等价于等屏幕动画、加载结束fresh(since)取某个时间点之后收到的第一帧用于确认一次操作之后屏幕是否真的变了settled()和fresh()是后面闭环反馈的基础先等画面静止再截图操作后再看有没有新画面逻辑非常直白。帧的消费方模型截图、Web 实时画面、闭环校验1模型的截图——Agent._ask 在每次调用规划 / 执行模型前抓取screen.frame随提示词一起发送若screen.live为假则直接抛出BlindError源码注释的原话never let the model act blind绝不盲动。2Web 实时画面——GET /api/frame.jpg把最新帧以no-store响应头返回页面轮询它刷出实时投屏/api/status里的screen字段则来自live判断。3闭环的眼睛——每次动作后系统对比动作前与动作后两帧vision.changed灰度化、缩放、逐像素差分并忽略指针本身经过的区域。若检测不到变化就把屏幕没变反馈给模型让它意识到可能点偏并重试phone.py 里同样用 before/after 帧差来在画面上定位指针实现坐标自动校正。用 JPEG 帧调试让模型看到什么都留底设置环境变量HIDAGENT_DEBUG1启动后每次 Agent 运行都会在~/.hidagent/traces/下保存一个目录见 README.md Debug mode 与 debug.pysteps.jsonl每次模型调用的提示词、原始回复、耗时以及每个动作002.jpg、003.jpg…每次模型调用真实看到的那一帧 JPEG模型看错或点偏时直接打开对应编号的图它当时到底看见了什么一目了然——这对调试视觉 Agent 极其有用。常见问题与已知限制锁屏即停镜像在锁屏时停止Agent 工作时需关闭自动锁部分界面不可镜像密码输入、Apple Pay、DRM 视频等 iOS 不推送镜像Agent 看不见手机找不到接收器多网卡 Linux 上需限制 AvahimDNS只监听手机所在网卡README.md Limitations画面静止 90 秒会不会被误判离线macOS 上用 90 秒窗口判断存活Linux 上直接数 UxPlay 的 TCP 连接更精确UxPlay 崩溃 / 断连监督循环自动重启frame清空后系统等待重新连上不会带着旧画面继续动作相关文件一览 文件说明server/hidagent/screen.py核心UxPlay 启动、GStreamer sink、JPEG 解析、存活判断server/hidagent/app.pyWeb API/api/frame.jpg实时帧、/api/status状态server/hidagent/vision.py帧差分屏幕变了吗与指针定位server/hidagent/phone.py基于前后帧闭环的点击、输入、校正server/hidagent/agent.py规划 / 执行模型与截图抓取BlindError保护server/hidagent/debug.py调试 trace把每次模型看到的 JPEG 落盘README.md快速开始、配置项与限制说明理解了这条眼睛链路你就掌握了整个项目输入侧的全部屏幕上的一切最终都只是内存里最新的一帧 JPEG——而 AI 的每个决定都从这一帧开始。赞分享【免费下载链接】esp32-iphone-agentLet an AI model use a real iPhone with a $7 ESP32: AirPlay eyes, USB HID hands, any OpenAI-compatible vision model. No Mac, no developer account, no jailbreak.项目地址https://gitcode.com/gh_mirrors/es/esp32-iphone-agent点击查看免费下载相关推荐ESP32 iPhone Agent 手机设置详解4 步开启辅助触控把 iPhone 变成 AI 能摸到的设备ESP32 iPhone Agent 手机设置详解4 步开启辅助触控把 iPhone 变成 AI 能摸到的设备 本文带你完整走一遍 ESP32 iPhoneOpenClaw Gateway 的 OpenAI 兼容 HTTP 接口开启 /v1/chat/completions 端点并接入任意 OpenAI 客户端OpenClaw Gateway 的 OpenAI 兼容 HTTP 接口开启 /v1/chat/completions 端点并接入任意 OpenAI 客户端Windows变身AirPlay接收器iPhone投屏零距离体验Windows变身AirPlay接收器iPhone投屏零距离体验 还在为苹果设备与Windows系统之间的生态壁垒而烦恼吗现在通过开源项目airplay2音视频视频网络创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑