You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

安卓系统如何录制AudioTrack播放的音频数据?

安卓AudioTrack播放音频录制/保存解决方案

方案1:自定义AudioTrack包装类 (全版本兼容,优先推荐)

这是最稳妥的实现方式,无系统版本限制、无需额外申请敏感权限,仅需要对现有播放逻辑做少量改造:

  • 实现逻辑:封装自定义类包装系统AudioTrack,在调用write()方法向播放缓冲区写入音频数据的同时,将相同的PCM数据写入本地文件流
  • 注意事项:
    • 存储PCM数据时要和初始化AudioTrack时设置的采样率、通道数、位深参数完全匹配,播放结束后如果需要生成可直接播放的WAV文件,补充44字节的标准WAV头即可
    • 文件写入操作要放在子线程执行,避免阻塞音频播放线程导致卡顿、爆音
    • 播放结束后必须及时关闭文件输出流,避免资源泄漏
  • 核心代码示例:
// 自定义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动态权限
  • 实现步骤:
    1. 动态获取录音权限
    2. 获取目标AudioTrack对应的播放会话ID,或通过AudioManager获取当前设备活跃的播放会话列表
    3. 构建AudioPlaybackCaptureConfiguration绑定需要捕获的播放会话
    4. 初始化AudioRecord实例时传入上述配置,启动录制即可直接获取到播放的音频数据流

方案3:系统级权限方案 (仅ROOT/有系统签名的定制设备可用)

如果是定制设备开发场景,已经获取ROOT权限或系统签名,可以直接读取底层音频驱动的输出流,也可直接调用tinycap等系统命令捕获全局音频输出,无需适配上层应用的播放逻辑。

选型建议

  • 仅需要捕获自有应用AudioTrack播放的音频,优先选择方案1,完全可控、性能损耗最低、无兼容问题
  • 已经放弃安卓10以下设备兼容,且不想改造现有播放逻辑,可以选择方案2
  • 方案3仅限有系统级权限的特殊场景使用,普通应用无法适配

内容的提问来源于stack exchange,提问作者Vinesh S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:06:03