本文整理了 Michael Olbrich 在 FOSDEM 2023 对使用 xdg-desktop-portal 和 PipeWire 在 Chromium 中开发高级摄像机 API 的介绍,包括了现状、实现、进展等方面。
来源:FOSDEM 2023
主讲人:Michael Olbrich
内容整理: 林宗灏
现状
Chromium 多年来一直使用 V4L2 API 来支持摄像机在浏览器中的运行。由于该 API 相对简单稳定,缺少开发更新,已无法支持摄像机在一些新场景中的应用,例如:摄像机选取、屏幕共享、IP 摄像机等。
为了拓宽摄像机在 Linux 系统上的应用场景,实现摄像机的灵活授权与对不同后端的支持,我们着手使用 xdg-desktop-portal 与 PipeWire 来开发一款高级摄像机 API。
实现
工作原理
首先,浏览器向门户发送摄像机的访问请求。门户确认请求后,浏览器通过门户将管线远程连接到 PipeWire。由于门户对访问加以限制,浏览器无法访问摄像头以外的任何内容。门户将文件描述符传递给 Chromium后,浏览器即可直接访问摄像机流。接着,Chromium 向 PipeWire 发送枚举对象信息,PipeWire 返回一个摄像机列表。最后,用户选择摄像机并开始流式传输,PipeWire 将视频帧发送至 chromium。
试验历程
我们在 2021 年开始对这一想法在 Chromium 中进行实现,开发过程也遇到了或多或少的问题。由于之前的 API 已经基本完成了 Chromium 中摄像机的使用,因此并没有很多致力于此的人与我们共同进行开发。当我们发布 API 后,我们难以找到对这类代码非常熟悉的开发人员来对集成系统的运行进行审查,因此进度十分缓慢。此外,由于需要在多平台上部署编译,我们需要对 PipeWire 进行动态加载而非纯粹的连接。然而,在 WebRTC 中,管线会动态加载以进行屏幕共享,若同时加载 Chromium 将发生冲突,这样的架构问题使我们的开发陷入困境。
后来,我们与深入了解 PipeWire 的 Jan Grulich 等人通过视频会议交流了一些架构方面的问题,决定在 WebRTC 上使用 Firefox 来实现我们的摄像机 API。于是,我们开始了第二轮的尝试。基于 Firefox 和 Linux 已有的摄像机 API,我们的想法是先在 WebRTC 中开发PipeWire摄像机后端,再在 Chromium 中开发 WebRTC 摄像机后端。
摄像机 API 的问题
目前的 API 存在着一系列的问题:
- 当在 Linux 中枚举设备时,我们能以同步调用的方式立即完成。但在浏览器中遍历设备时,需要先与门户对话,门户询问用户是否允许应用程序访问摄像机,授权后才能执行设备枚举,所以需要一个新的异步 API 来实现这一功能。
- 目前的 API 通过给定一个字符串作为静态函数的参数来选择并打开摄像机,为了维持摄像头的开放状态需要与门户进行多次对话。为了精简这个冗余过程,我们需要开发新的 API 来记录从枚举到实际访问间的一些摄像机状态。
- WebRTC 会将从摄像机获取的帧进行复制并转换为 l420 格式再传递给浏览器,而 Chromium 假设从摄像机获取的视频帧均为原始帧。因此,我们需要一个新的 API 使得 Chromium 对来自后端的帧进行相同的处理。
进展
当前进展
- WebRTC
- 合并提交拆分通用门户 / PipeWire 代码,该代码用于门户的摄像机共享。
- 添加了用于视频捕获的原始帧的回调函数。
- 添加了 PipeWire / 门户视频捕获支持。
- 在 Chromium 中构建视频捕获实现。
- Chromium
- 考量 V4L2 摄像机支持。
- 为门户 / PipeWire 摄像机添加后端。
后续工作
我们仍然有许多功能需要去实现,例如支持新的 xdg-desktop-portal 设备 API,图像旋转,摄像机平移、倾斜、缩放、聚焦等基本操作。希望在未来的某一天,PipeWire 摄像机将被作为默认方式在 Chromium 中得到使用。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。