CLAUDE.md 3.2 KB

CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

模块概述

frame/audio 是音频框架模块,提供音频播放、录制和系统音频捕获功能。该模块基于 Android MediaPlayer 和 MediaRecorder,并支持 Android Q+ 的系统音频捕获。

核心架构

1. 音频播放 (Audio Player)

  • InnerMediaPlayer.kt: 基于状态机的音频播放器封装
  • 支持文件路径播放、状态回调、播放控制
  • 状态管理:IDLE → INITIALIZED → PREPARED → STARTED/PAUSED → STOPPED/COMPLETED

2. 音频录制 (Audio Recording)

  • AbstractInnerRecorder.kt: 录音器抽象接口
  • InnerMediaRecorder.kt: MediaRecorder 实现,支持 AAC 编码
  • 特性:实时振幅获取、录制进度回调、最大时长限制

3. 系统音频捕获 (System Audio Capture)

  • SystemAudioCaptureHelper.kt: 系统音频捕获主控制器
  • mediaprojection/: MediaProjection 权限管理和服务
  • 要求:Android Q+ (API 29+)
  • 使用场景:录屏音频、应用内音频捕获

关键组件

MediaProjection 权限管理

// 透明 Activity 方式请求权限
MediaProjectionRequireActivity.kt

// 前台服务保持 MediaProjection
MediaProjectionRequireService.kt

// 权限管理核心逻辑
MediaProjectionHelper.kt

状态机模式

所有音频组件都基于严格的状态机:

  • Player: IDLE → INITIALIZED → PREPARED → STARTED → PAUSED/STOPPED
  • Recorder: INITIALIZED → RECORDING → STOPPED → RELEASED

依赖关系

内部依赖

compileOnly project(":frame:log")      // 日志框架
compileOnly project(":frame:coroutine") // 协程支持
compileOnly project(":frame:util")     // 工具类

权限要求

  • RECORD_AUDIO: 音频录制
  • FOREGROUND_SERVICE: MediaProjection 服务
  • MEDIA_PROJECTION: 系统音频捕获 (仅 Android Q+)

开发指南

音频播放使用

val player = InnerMediaPlayer().apply {
    setAudioFilePath("/path/to/audio.mp3")
    onPlaybackStarted = { /* 播放开始 */ }
    onPlaybackCompleted = { /* 播放完成 */ }
}
player.startPlayback()

音频录制使用

val recorder = InnerMediaRecorder().apply {
    setOutputFilePath("/path/to/output.aac")
    setMaxDuration(60000) // 60秒
    onRecordingStarted = { /* 开始录制 */ }
}
recorder.startRecording()

系统音频捕获使用

SystemAudioCaptureHelper
    .setSampleRate(44100)
    .setSystemAudioListener(object : SystemAudioListener {
        override fun feedBufferAudioFrame(frame: ByteArray, timeStamp: Long) {
            // 处理音频数据帧
        }
    })
    .updateCaptureState(true) // 开始捕获

注意事项

  1. 状态检查: 所有操作前必须检查组件状态,避免状态异常
  2. 资源释放: 使用完毕后调用 releasePlayer()releaseRecorder()
  3. 权限申请: 系统音频捕获需要用户授权 MediaProjection 权限
  4. API兼容性: 系统音频捕获仅支持 Android Q (API 29) 及以上版本
  5. 线程安全: MediaProjection 相关操作已使用协程和线程安全设计

模块版本

当前版本:6.0.0 (com.wenext.android:frame-audio)