参考文档:
Audio-内录实现原理(上)
Audio-内录实现原理(下)
一、实现原理
REMOTE_SUBMIX
是Android系统提供的内录(Internal Audio Capture)方案,用于捕获设备音频输出(如扬声器播放的声音)而非麦克风输入。其核心机制如下:
HAL层数据流转
- 音频数据不写入物理设备,而是由HAL层(
audio.r_submix.default.so
)开辟独立缓冲区,实现软件级混音分流。 - 数据流路径:
AudioFlinger
→RemoteSubmix
HAL模块 → 应用层AudioRecord
。
- 音频数据不写入物理设备,而是由HAL层(
静音与无感录制
- 内录时扬声器静音(避免回声),但通过HAL缓冲区的读写分离,实现录制过程不影响正常播放。
二、应用场景
场景 | 说明 |
---|---|
系统录屏 | 默认录屏功能使用REMOTE_SUBMIX 捕获系统音轨(如游戏、视频声音),无需麦克风。 |
投屏镜像 | 投屏工具(如Scrcpy)通过其实现声音同步传输至接收端(如电视)。 |
云控平台 | 远程设备管理(如车机导航)需双向音频时,内录系统播报声并回传到控制端。 |
媒体应用测试 | 自动化测试中捕获音频输出,验证播放内容是否正确。 |
三、关键函数与流程
1. 音频源设置
// 指定音频源为REMOTE_SUBMIX
builder.setAudioSource(MediaRecorder.AudioSource.REMOTE_SUBMIX);
2. 动态路由策略
通过setAudioPlaybackCaptureConfig
实现更灵活的内录控制:
// 创建动态捕获配置
AudioPlaybackCaptureConfiguration config =
new AudioPlaybackCaptureConfiguration.Builder(mediaProjection)
.addMatchingUsage(AudioAttributes.USAGE_MEDIA) // 捕获媒体类音频
.build();
// 应用到AudioRecord
AudioRecord record = new AudioRecord.Builder()
.setAudioPlaybackCaptureConfig(config)
.setAudioFormat(format)
.build();
- 优势:支持录制通话/VoIP音频(需
MediaProjection
)、扬声器发声与录制并行。