尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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),仅供参考
RELATED

相关推荐

REA引擎选择三法:--provider参数、provider_id与REA_ANALYSIS_PROVIDER环境变量

REA引擎选择三法:--provider参数、provider_id与REA_ANALYSIS_PROVIDER环境变量

REA引擎选择三法:--provider参数、provider_id与REA_ANALYSIS_PROVIDER环境变量 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea REA 是…

📅 2026/10/9 0:52:08
Flutter迁移OpenHarmony实战:文章详情页从0到1完整记录

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

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

📅 2026/10/9 0:52:08
AI原生开发范式:skills作为可编程意图容器的工程实践

AI原生开发范式:skills作为可编程意图容器的工程实践

1. “skills”不是功能模块,而是现代AI开发者的新型工作范式最近在几个前端技术群和AI工程实践社区里,几乎每天都能看到“skills”这个词被反复提起——不是作为普通词汇,而是作为一个带引号的、首字母小写的专有名词。它不指代某项具体技术栈…

📅 2026/10/9 0:47:08
MORE NEWS

更多资讯

📰

DouK-Downloader 完整教程:5 步配好免费的抖音视频批量下载工具

DouK-Downloader 完整教程:5 步配好免费的抖音视频批量下载工具 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader 刷到一条好视频,手动点保存、命…

📰

做机器学习项目时,为什么特征工程经常比换模型更重要:用 TaoToken 统一 Key 跑通特征验证流水线

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

📰

Win7 64位打印机装不上?先查Print Spooler服务再换驱动

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

📰

硬件知识从零到实战:元器件、电源驱动与PCB设计的完整学习路线

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

📰

Weave Net 多子网自动分配(Multi-Subnet IPAM):用 WEAVE_CIDR 与 --ipalloc-default-subnet 实现跨子网寻址与隔离

网络云原生 【免费下载链接】weave Simple, resilient multi-host containers networking and more. 项目地址: https://gitcode.com/gh_mirrors/weave4/weave 点击查看 免费下载 本文聚焦 Weave Net(当前仓库 weave4/weave)的 IPAM 核心能力…

📰

正则表达式量词完全指南:`+`、`*`、`?` 与 `{n}` 的匹配次数控制(zh.javascript.info)

文档教程前端 【免费下载链接】zh.javascript.info 现代 JavaScript 教程(The Modern JavaScript Tutorial),以最新的 ECMAScript 规范为基准,通过简单但足够详细的内容,为你讲解从基础到高阶的 JavaScript 相关知识。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬