首页 / 资讯中心 / 文章详情

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

Piik原生屏幕捕获实现:WGC、WebCodecs与跨平台采集架构解析 ★ FEATURED ARTICLE
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),仅供参考
阅读完成 · 觉得有帮助?
咨询建站