Piik原生屏幕捕获实现:WGC、WebCodecs与跨平台采集架构解析

发布时间:2026/10/9 0:54:31

Piik原生屏幕捕获实现:WGC、WebCodecs与跨平台采集架构解析 Piik原生屏幕捕获实现WGC、WebCodecs与跨平台采集架构解析【免费下载链接】PiikFree, open-source screen sharing for private live streams with friends. Watch together in a browser or self-host Piik. 免费开源的私密屏幕共享支持游戏直播、一起看电影与自部署。项目地址: https://gitcode.com/gh_mirrors/pi/PiikPiik 是一个免费开源的私密屏幕共享工具支持游戏直播、一起看电影和自部署最多支持 1 个 Host 与 20 位认证观众。为了让共享画面更流畅、更省电Piik 没有止步于浏览器采集而是为桌面客户端实现了原生屏幕捕获管线Windows 上基于 WGC 与硬件编码器浏览器侧用 WebCodecs 做共享编码池三大平台共用一套受约束的二进制帧协议。本文带你拆解这套跨平台采集架构的设计思路。 为什么 Piik 要做原生屏幕捕获浏览器里的getDisplayMedia能完成能看的共享但有两个硬伤拿不到按进程的音频共享某个游戏窗口时浏览器无法只捕获该进程的音效Windows 上这要靠 WASAPI 进程环回编码开销不可控观众一多浏览器要为每条 P2P 连接各编码一次CPU 占用线性上涨。Piik App 的解法是一个进程隔离的采集二进制 一个 Go 主进程。采集进程独占屏幕/窗口/音频设备编码一次产出 H.264/VP8 码流与 Opus 音频主进程把它喂给共享的 Pion WebRTC 源多个观众复用同一条编码输出。架构决策记录见 ADR-0010共享编码输出模型见 ADR-0013。 Windows 管线WGC 捕获 Media Foundation 硬件编码Windows 采集进程native/capture/windows/由三部分拼成完整说明见 README.md1. 捕获层WGCWindows Graphics Capture枚举本地显示器和顶层窗口每个窗口绑定 PID 与进程创建时间见 capture_target.cpp显示器用 WGC 默认渲染设备环回音频窗口用CreateForWindow 进程树环回音频Windows 11build 20348支持无边界采集IsBorderRequired/GraphicsCaptureAccess默认隐藏系统共享边框一个实测细节144 Hz 窗口下WGC 的零MinUpdateInterval只给了 48 fps改用受支持的非零间隔 相位连续输出节奏后同一来源稳定输出 29.99/60.00 fps。2. 编码层适配器绑定的硬件 H.264H.264 走 Media Foundation 硬件 MFT保持 NV12 零拷贝面h264_encoder.cppVP8 走 libvpx 软编码读同一张 NV12 暂存纹理复用同一编码帧边界--codec auto在 4 秒选择预算内比较目标档位的编码工作量达标 H.264 无需软件对比选定的编解码器在档位和来源切换中保持固定。3. 音频层进程环回视频与音频是两个有界的子进程窗口音频用 WASAPI 进程树环回按激活探测而非猜测系统版本。音频初始化失败只降级音频不拖垮视频。 进程之间怎么说话SMED 受约束帧协议采集进程和主进程之间没有花哨的 IPC只有一条带上限的二进制帧协议SMED魔数 32 字节头帧类型包括 H.264、VP8、PCM、状态与控制帧尺寸全部有硬上限解析代码见 protocol.go。这套协议的核心思想是代际替换切换分辨率/帧率/码率时App 准备一个全新的采集/编码代际装好后在同一 Pion 源后面整体替换旧代际——观众的 PeerConnection 全程不断线。Go 侧的传输与共享源由 mediaedge 负责当前采集代际由 nativehost 负责。 WebCodecs 的角色浏览器侧共享编码池有同学会问标题里的 WebCodecs 在哪它属于浏览器路径。浏览器没有 WGC但 Chrome 提供了 WebCodecs 硬件编码器Piik 用它做了共享编码池同一个捕获源只编码一次多个观众连接复用同一条编码输出各自保留独立的 RTP 传输。实现见编码池与成员/分组管理browser-encoding-pool.ts单个 WebCodecs 生产者browser-encoding-producer.ts统计与预算观测browser-encoding-stats.ts于是 Piik 形成了清晰的双轨原生 App 有硬件编码能力时观众复用原生 H.264 输出纯浏览器 Host 则回落到 WebCodecs 编码池两条路在一次编码、多路分发这个模型上收敛。 跨平台架构一份契约三个平台适配器Piik 的桌面包在每个平台都带一个进程隔离的采集 sidecar只替换平台实现契约不变平台捕获音频编码源码位置WindowsWGC D3D11WASAPI 进程/设备环回MF 硬件 H.264 / libvpx VP8native/capture/windows/macOSScreenCaptureKitSCStream 应用/显示器音频VideoToolbox 硬件 H.264main.swiftLinuxXDG Desktop Portal PipeWirePipeWire PulseAudio 兼容源GStreamer 硬件 H.264main.c三个平台都输出同样的Annex-B 码流 SMED 协议主进程完全感知不到平台差异。依赖缺失时如 Linux 没有硬件编码器App 会干净地退回浏览器采集而不是捆绑一个 80 MB 的媒体运行时。模块职责边界nativecapture / mediaedge / nativehost / nativeviewer / nativecontrol在 native-client-media.md 中有完整说明。✅ 这套架构对普通用户意味着什么更流畅硬件编码让 1080p60 的共享只占用个位数百分点的单核 CPU更私密采集发生在本地隔离进程里房间仍由你自部署的 Piik 服务器仲裁更省心质量档位热切换时观众不掉线音频异常不会弄黑视频。想深入了解测量数据可阅读 原生客户端媒体证据想动手构建采集 sidecar各平台 READMEWindows、macOS、Linux给出了完整命令。【免费下载链接】PiikFree, open-source screen sharing for private live streams with friends. Watch together in a browser or self-host Piik. 免费开源的私密屏幕共享支持游戏直播、一起看电影与自部署。项目地址: https://gitcode.com/gh_mirrors/pi/Piik创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/9 0:54:31

Flutter迁移OpenHarmony实战:文章详情页从0到1完整记录

1. 项目概述1.1 核心需求解析先说结论:这是一次把 Flutter 应用跑到 OpenHarmony 设备上的完整实战,我挑的载体是一个口腔护理资讯类 App,核心功能集中在文章详情页的实现上。选择这个场景的原因很直接——文章详情页是内容型应用里面信息密度…

2026/10/9 0:54:31

模型服务规模化:调度、KV Cache 与资源池化的系统之道

SOSP 的 Session 1A 开场就是 Model Serving at Scale,这个安排本身就很能说明问题。这几年我和团队一直在做 LLM 推理服务化,眼看着这个方向从"AI 实验室里的小工具"变成了"真正意义上的系统软件"——调度、缓存、资源池化、故障恢…

2026/10/9 1:44:35

U-Boot移植必先读懂Kbuild构建系统

1. 为什么U-Boot移植第一步不是改板级代码,而是读懂Kbuild?很多人拿到一块新开发板,第一反应是翻board/rockchip/rv1106/目录,急着改board_init.c、调dram_init(),结果编译报错一堆undefined reference,或者…

2026/10/9 1:44:35

嵌入式CAN总线从物理层到应用层实战指南

CAN总线这东西,刚入行嵌入式的朋友十有八九都听过,但真正能把它讲明白、用利索的人并不多。我见过太多人做项目时,传感器数据一多、节点一分散,就开始抓瞎:I2C距离太短,串口点对点又不够用,RS48…

2026/10/9 1:44:35

STM32传感器感知链路工程:从物理信号到车外语义理解

1. 传感器不是“开关”,而是 STM32 的感官神经末梢很多人第一次在 STM32 项目里写if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)),就以为自己“用上了传感器”——其实你只是读了一个机械按键的电平。真正的传感器,比如GY-33 颜色传感器、VL…

2026/10/9 1:39:34

嵌入式Bootloader本质:启动仲裁器与汽车级安全启动实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑