安卓系统如何录制AudioTrack播放的音频数据?
安卓AudioTrack播放音频录制/保存解决方案
方案1:自定义AudioTrack包装类 (全版本兼容,优先推荐)
这是最稳妥的实现方式,无系统版本限制、无需额外申请敏感权限,仅需要对现有播放逻辑做少量改造:
- 实现逻辑:封装自定义类包装系统
AudioTrack,在调用write()方法向播放缓冲区写入音频数据的同时,将相同的PCM数据写入本地文件流 - 注意事项:
- 存储PCM数据时要和初始化
AudioTrack时设置的采样率、通道数、位深参数完全匹配,播放结束后如果需要生成可直接播放的WAV文件,补充44字节的标准WAV头即可 - 文件写入操作要放在子线程执行,避免阻塞音频播放线程导致卡顿、爆音
- 播放结束后必须及时关闭文件输出流,避免资源泄漏
- 存储PCM数据时要和初始化
- 核心代码示例:
// 自定义AudioTrack包装类的write方法示例 public int write(byte[] audioData, int offsetInBytes, int sizeInBytes) { // 音频录制开关开启时,先把数据写入本地文件 if (fileOutputStream != null && isRecording) { try { fileOutputStream.write(audioData, offsetInBytes, sizeInBytes); } catch (IOException e) { e.printStackTrace(); } } // 调用系统原生方法完成音频播放 return super.write(audioData, offsetInBytes, sizeInBytes); }
方案2:AudioPlaybackCapture API (仅支持安卓10/API 29及以上版本)
系统原生提供的播放音频捕获能力,适合不需要改造现有播放逻辑、或者需要捕获同设备其他应用播放音频的场景:
- 前置要求:
- 要捕获的音频所属应用的
AndroidManifest.xml中android:allowAudioPlaybackCapture属性为true(自有应用默认开启该属性) - 提前申请
RECORD_AUDIO动态权限
- 要捕获的音频所属应用的
- 实现步骤:
- 动态获取录音权限
- 获取目标AudioTrack对应的播放会话ID,或通过
AudioManager获取当前设备活跃的播放会话列表 - 构建
AudioPlaybackCaptureConfiguration绑定需要捕获的播放会话 - 初始化
AudioRecord实例时传入上述配置,启动录制即可直接获取到播放的音频数据流
方案3:系统级权限方案 (仅ROOT/有系统签名的定制设备可用)
如果是定制设备开发场景,已经获取ROOT权限或系统签名,可以直接读取底层音频驱动的输出流,也可直接调用tinycap等系统命令捕获全局音频输出,无需适配上层应用的播放逻辑。
选型建议
- 仅需要捕获自有应用AudioTrack播放的音频,优先选择方案1,完全可控、性能损耗最低、无兼容问题
- 已经放弃安卓10以下设备兼容,且不想改造现有播放逻辑,可以选择方案2
- 方案3仅限有系统级权限的特殊场景使用,普通应用无法适配
内容的提问来源于stack exchange,提问作者Vinesh S
相关产品推荐
相关产品推荐

