菜单

媒体捕获系统

相关源文件

媒体捕获系统是AFFiNE中的一个原生模块,它能够从特定应用程序或系统范围的源捕获、处理和录制音频。该模块主要用Rust实现,并通过NAPI绑定暴露给JavaScript,为前端应用程序和底层系统音频API之间提供了一个桥梁。

系统概览

媒体捕获系统允许AFFiNE执行多项关键的音频相关功能:

  1. 发现系统上运行的应用程序
  2. 从特定应用程序捕获音频
  3. 捕获全局系统音频
  4. 处理音频流(混合、重采样)
  5. 监视应用程序状态变化
  6. 处理音频录制权限

目前,该实现主要针对macOS,利用了Core Audio和ScreenCaptureKit等平台特定框架。

来源

核心组件

类架构

媒体捕获系统围绕几个关键类构建,这些类被暴露给JavaScript。

来源

ShareableContent

ShareableContent是媒体捕获系统的主要入口点。它提供了以下方法:

  1. 发现正在运行的应用程序
  2. 检查录制权限
  3. 创建全局音频捕获点
  4. 设置应用程序更改的事件监听器

此类与macOS的ScreenCaptureKit进行交互,以发现应用程序并监视其状态变化。

Application和TappableApplication

  • Application:代表一个具有基本信息的通用应用程序。
  • TappableApplication:继承Application类,并增加了音频捕获功能。

TappableApplication包含以下方法:

  1. 检查应用程序是否正在运行
  2. 获取应用程序的图标
  3. 通过tapAudio()方法开始音频捕获

AudioTapStream

AudioTapStream代表一个活动的音频捕获会话,它提供:

  1. 有关捕获的音频信息(采样率、通道数)
  2. 干净地停止捕获过程的能力
  3. Core Audio资源的内部管理

来源

音频捕获管道

音频捕获过程涉及原生和JavaScript层之间的多个步骤。

来源

特定应用程序音频捕获

当从特定应用程序捕获音频时:

  1. 应用程序由其进程ID和macOS音频对象ID标识。
  2. 创建CATapDescription来指定如何捕获应用程序的音频。
  3. 创建聚合音频设备以管理音频流。
  4. 设置I/O过程以接收音频缓冲区数据。
  5. 音频数据被处理并通过回调传递给JavaScript。

全局音频捕获

用于捕获所有系统音频:

  1. 创建一个全局音频捕获点,可以选择排除特定应用程序。
  2. 其余过程与特定应用程序捕获类似。

音频处理

音频处理管道包括:

  1. 缓冲区提取:从Core Audio结构中提取PCM数据。
  2. 通道处理:如果需要,将多通道(立体声)音频转换为单声道。
  3. 混合:以配置的权重组合输入和输出音频。
  4. 采样率转换:确保音频的采样率正确。
  5. 优化:在支持的平台上使用SIMD指令以获得更好的性能。

音频混合代码

来源

JavaScript API用法

媒体捕获系统通过@affine/native模块公开了一个简洁的JavaScript API。

来源

实现细节

平台特定实现

当前的实现主要针对macOS平台,关键组件包括:

  1. Core Audio集成:使用Core Audio API进行音频捕获和设备管理。
  2. ScreenCaptureKit:用于应用程序发现和监控。
  3. Objective-C桥接:通过Rust FFI与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类型和自定义错误类型来实现全面的错误处理。

来源

性能优化

该系统包含多项性能优化:

  1. SIMD加速:在支持的平台上使用SIMD指令进行音频处理。
  2. 高效的缓冲区管理:最小化内存分配和复制。
  3. 非阻塞回调:确保主线程平稳运行而不被阻塞。
  4. 原生Rust实现:利用Rust的性能进行音频处理。

来源

与AFFiNE集成

媒体捕获系统通过原生模块系统与更广泛的AFFiNE架构集成。

来源

媒体捕获系统通过@affine/native包公开,这是AFFiNE架构中“原生组件”层的一部分,如高级系统架构图所示。

平台支持

目前,媒体捕获系统的先进功能主要针对macOS平台实现。该系统已在以下平台进行了测试:

平台架构支持级别
macOSIntel (x64)完全支持
macOSApple Silicon (arm64)完全支持
Windowsx64,arm64未实现
Linuxx64,arm64未实现

原生模块分发系统会自动加载用户平台和架构的相应二进制文件。

来源

示例实现:媒体捕获演示

AFFiNE包含一个媒体捕获演示,用于测试和展示媒体捕获系统的功能。

来源

该演示展示了:

  1. 发现和显示可用的应用程序。
  2. 开始和停止录制。
  3. 处理和保存捕获的音频。
  4. 管理录制状态和权限。

结论

媒体捕获系统通过一个设计良好的原生模块架构为AFFiNE提供了强大的音频捕获能力。虽然目前主要针对macOS,但该系统的模块化设计未来可以扩展到其他平台。

该实现的主要优势包括:

  1. 高效的音频处理,并针对不同平台进行了优化。
  2. 简洁的JavaScript API,便于与前端集成。
  3. 全面的错误处理和资源管理。
  4. 有效的事件系统,用于监视应用程序状态。

有关AFFiNE中其他原生功能的信息,请参阅原生模块集成

来源