媒体捕获系统是AFFiNE中的一个原生模块,它能够从特定应用程序或系统范围的源捕获、处理和录制音频。该模块主要用Rust实现,并通过NAPI绑定暴露给JavaScript,为前端应用程序和底层系统音频API之间提供了一个桥梁。
媒体捕获系统允许AFFiNE执行多项关键的音频相关功能:
目前,该实现主要针对macOS,利用了Core Audio和ScreenCaptureKit等平台特定框架。
来源
媒体捕获系统围绕几个关键类构建,这些类被暴露给JavaScript。
来源
ShareableContent是媒体捕获系统的主要入口点。它提供了以下方法:
此类与macOS的ScreenCaptureKit进行交互,以发现应用程序并监视其状态变化。
Application:代表一个具有基本信息的通用应用程序。TappableApplication:继承Application类,并增加了音频捕获功能。TappableApplication包含以下方法:
tapAudio()方法开始音频捕获AudioTapStream代表一个活动的音频捕获会话,它提供:
来源
音频捕获过程涉及原生和JavaScript层之间的多个步骤。
来源
当从特定应用程序捕获音频时:
CATapDescription来指定如何捕获应用程序的音频。用于捕获所有系统音频:
音频处理管道包括:
音频混合代码
来源
媒体捕获系统通过@affine/native模块公开了一个简洁的JavaScript API。
来源
当前的实现主要针对macOS平台,关键组件包括:
macOS实现的 kode 结构。
media_capture/
├── src/
│ ├── macos/
│ │ ├── audio_buffer.rs # Audio buffer processing
│ │ ├── ca_tap_description.rs # Core Audio tap configuration
│ │ ├── error.rs # Error handling
│ │ ├── screen_capture_kit.rs # Application discovery
│ │ ├── tap_audio.rs # Audio tapping implementation
│ │ └── utils.rs # Utility functions
│ └── lib.rs # Library entry point
来源
该系统使用Rust的Result类型和自定义错误类型来实现全面的错误处理。
来源
该系统包含多项性能优化:
来源
媒体捕获系统通过原生模块系统与更广泛的AFFiNE架构集成。
来源
媒体捕获系统通过@affine/native包公开,这是AFFiNE架构中“原生组件”层的一部分,如高级系统架构图所示。
目前,媒体捕获系统的先进功能主要针对macOS平台实现。该系统已在以下平台进行了测试:
| 平台 | 架构 | 支持级别 |
|---|---|---|
| macOS | Intel (x64) | 完全支持 |
| macOS | Apple Silicon (arm64) | 完全支持 |
| Windows | x64,arm64 | 未实现 |
| Linux | x64,arm64 | 未实现 |
原生模块分发系统会自动加载用户平台和架构的相应二进制文件。
来源
AFFiNE包含一个媒体捕获演示,用于测试和展示媒体捕获系统的功能。
来源
该演示展示了:
媒体捕获系统通过一个设计良好的原生模块架构为AFFiNE提供了强大的音频捕获能力。虽然目前主要针对macOS,但该系统的模块化设计未来可以扩展到其他平台。
该实现的主要优势包括:
有关AFFiNE中其他原生功能的信息,请参阅原生模块集成。
来源