docker中运行一个带界面的虚拟主机,例如linux x11,再使用Selkies WebRTC(selkies-gstreamer)技术在chrome现代浏览器中运行操作远程主机,(类似远程桌面连接),开源实现:https://github.com/nickrunning/wechat-selkies
还有一种方案就是docker中运行windows,通过远程桌面连接到这个windows虚拟机,参考dockurr/windows(Docker 内部跑 QEMU 虚拟机),这是市面上唯一能用 Docker 跑完整 Windows 桌面、支持 RDP 远程桌面的方案,
一、先讲底层:WebRTC 基础原理
WebRTC = Web Real-Time Communication(网页实时通信),W3C 浏览器原生标准,不用插件,核心目标:浏览器与服务端建立低延迟点对点音视频+双向数据通道。
1. 三大核心组件
RTCPeerConnection 负责整条链路:NAT 穿透(ICE)、音视频编码、DTLS 加密、带宽自适应、丢包补偿。传输底层走 UDP,优先低延迟,牺牲少量数据完整性,完美适配远程桌面。
媒体流(MediaStream) 采集屏幕画面、音频,编码为 H.264/H.265/VP9 视频流。
RTCDataChannel 独立二进制数据通道,不占用视频流带宽;用来传输鼠标坐标、键盘按键、剪贴板文字、文件指令等控制信号,和视频画面分离传输。
2. 连接建立流程(信令 + P2P)
信令通道(WebSocket):浏览器与容器内 Selkies 服务建立 WS,交换 SDP(音视频编码能力)、ICE 网络候选地址;仅用来牵线,画面流量不走 WS。
ICE 打洞:自动尝试内网直连、公网 STUN 打洞;内网不通则走 TURN 服务器中转。
P2P 直连成功:视频画面、音频、键鼠指令全部通过 UDP 点对点传输,不再经过信令服务器转发,延迟极低(100~300ms)。
全程加密:DTLS 握手加密媒体流,SRTP 加密视频数据包,外网访问也安全。
3. WebRTC 对比 VNC/Guacamole 的优势
VNC:TCP 传输,延迟高、画质差、浏览器需要插件/JS 转译,帧率上限低;
Apache Guacamole:画面全部中转服务器,服务器带宽压力巨大;
WebRTC:UDP P2P、硬件编解码、60fps 高清、原生浏览器支持、双向高速数据通道。
二、Selkies WebRTC(selkies-gstreamer)完整原理
Selkies 前身是 Google 工程师开源项目,全称 selkies-gstreamer,一套专门给 Linux X11 桌面做 WebRTC 串流的工具栈,相当于“WebRTC 远程桌面专用套件”,wechat-selkies 就是基于它的封装镜像。
1. Selkies 内部技术栈
GStreamer:底层多媒体管道,负责捕获 Linux X11 虚拟桌面画面、硬件编码(NVENC/VAAPI)、封装成 WebRTC 标准流;支持显卡硬件加速,1080P 60 帧无压力。
内置 Web 信令服务:自带 HTTP/HTTPS + WebSocket 服务(3000/3001 端口),不用额外部署信令服务器,开箱即用。
WebRTC 封装层:封装 RTCPeerConnection、ICE、DataChannel,自动处理 NAT 穿透;内置前端 HTML 页面,浏览器打开就能自动发起 WebRTC 连接。
X11 虚拟显示层:在容器内创建虚拟屏幕(不需要显示器、显卡物理输出),Linux 微信/QQ 运行在这个虚拟桌面里。
双向控制转发:
上行 DataChannel:浏览器鼠标移动、点击、键盘输入 → 传给容器,模拟 X11 键鼠事件操作微信;
下行视频流:虚拟桌面画面编码 → WebRTC 推流到浏览器渲染;
额外 DataChannel 通道:剪贴板同步、文件上传下载、图片复制功能。
2. Selkies 工作流程极简概括
容器内:X11虚拟桌面(运行微信) → GStreamer采集画面 → 硬件H265编码 → Selkies WebRTC服务网络层:WebSocket信令协商连接 → UDP P2P通道浏览器端:Web前端JS建立RTCPeerConnection → 接收视频流渲染画面 → 键鼠操作通过DataChannel回传服务端
三、wechat-selkies 完整整体原理(项目怎么把微信+Selkies拼起来)
整个项目是三层嵌套结构:Docker容器 + Linux虚拟桌面 + Selkies串流 + 官方Linux微信客户端。
1. 层级拆解
第一层:Docker 容器隔离环境
基础镜像:linuxserver 维护的 selkies 基础 Ubuntu 镜像,预装 selkies-gstreamer、X11、中文字体、中文输入法、音视频依赖;
持久化挂载:把 /config 目录映射宿主机,微信安装目录、聊天记录、账号缓存全部存在宿主机,删除容器数据不丢失;
权限优化:shm_size 扩容,解决 Linux 微信渲染卡顿;可挂载显卡设备 /dev/dri 开启硬件编解码加速。
第二层:容器内 X11 虚拟桌面
容器没有物理显示器,依靠 Xorg 创建内存虚拟屏幕,整个图形环境跑在内存里;自动脚本启动官方 Linux 微信/QQ,窗口渲染在这个虚拟桌面中,所有界面像素都能被 GStreamer 捕获。
第三层:Selkies WebRTC 串流转发(核心桥梁)
容器启动时自动拉起 selkies-gstreamer 服务:
GStreamer 持续抓取 X11 虚拟桌面的完整画面;
自动调用 CPU/显卡硬件编码器压缩视频;
Selkies 内置 Web 服务监听 3000/3001 端口,浏览器访问网页后,前端 JS 自动发起 WebSocket 信令握手;
握手完成建立 UDP P2P WebRTC 通道,浏览器实时接收画面;
用户在网页里点击、打字,全部通过 RTCDataChannel 传回容器,Selkies 把指令转为 X11 系统键鼠事件,控制虚拟桌面上的微信;
额外数据通道实现:剪贴板双向同步、侧边栏文件上传下载、图片复制。
2. 为什么这个方案安全、风控低
全程运行腾讯官方 Linux 微信客户端,没有逆向微信协议、没有第三方接口劫持;Selkies 只是“远程屏幕投屏工具”,等同于你用向日葵/ToDesk 远程控制一台 Linux 电脑上的微信,微信服务端识别为正常 PC 客户端登录,封号风险远低于网页微信、协议机器人。
3. 完整数据流闭环
浏览器操作:鼠标点击聊天框 → DataChannel UDP 上传 → Selkies → X11 键鼠模拟 → 微信窗口响应;
微信界面变化(收到消息、打开图片)→ X11 画面更新 → GStreamer 采集编码 → WebRTC UDP 下行 → 浏览器视频标签渲染画面;
复制文字/文件:独立 DataChannel 传输二进制文本/文件,不占用视频带宽。
四、核心总结
WebRTC:浏览器原生低延迟P2P通信标准,UDP传输、自带加密、音视频+双向数据双通道,是低延迟远程桌面的底层标准;
Selkies(selkies-gstreamer):基于 WebRTC + GStreamer 的 Linux 专用远程桌面工具,自动管理虚拟桌面画面采集、硬件编码、信令服务、键鼠指令转发,省去开发者从零搭建 WebRTC 远程桌面;
wechat-selkies:Docker 容器封装方案,底层 Ubuntu + X11 虚拟桌面运行官方 Linux 微信,上层调用 Selkies WebRTC 把整个微信界面投屏到任意浏览器,实现网页远程使用微信。
网友回复
windows如何设置让多个人同时远程桌面连接同一台电脑同时可操作不被踢出?
什么是WebRCD技术?
如何在centos的服务器docker上安装运行微信qq?
如何用ai图片模型祛除图片油腻感?
google的gemini-omni多模态大模型在哪可以免费体验?
google的Antigravity 、Antigravity CLI、Antigravity IDE、Antigravity SDK有啥区别不同?
Pyaudio如何录制windows扬声器输出的声音?
为啥win10电脑上sounddevice与pyaudio无法播放声音?
半导体摩尔定律与韬(τ)定律区别?
千问qwen有没有实时同声翻译的ai大模型?


