【Android】获取设备音频

在 Android 中获取音频数据,主要取决于你需要获取的是麦克风采集的音频(如人声、环境音),还是系统内部播放的音频(如音乐、视频声音,即系统内录)。以下是具体的实现方案:

. 获取麦克风采集的音频(AudioRecord)

这是最常见的需求,通过 Android 提供的 AudioRecord 类,可以从硬件麦克风获取原始的 PCM 数据24。

权限配置:需要在 AndroidManifest.xml 中声明 RECORD_AUDIO 权限。在 Android 6.0 (API 23) 及以上版本,还需要在运行时动态申请该权限2。

初始化配置:创建 AudioRecord 实例时,需要指定音频源(如 AudioSource.MIC)、采样率(如 44100Hz)、声道配置(单声道或立体声)、音频格式(如 16bit PCM)以及缓冲区大小46。

数据读取:调用 startRecording() 后,通过轮询调用 read() 方法,系统会将硬件采集到的数据填充到 byte\[\] 或 ByteBuffer 中24。

. 获取系统内部播放的音频(内录)

如果你需要捕获手机正在播放的声音(例如做投屏、录屏或音频分析),有以下几种主流方案:

AudioPlaybackCapture API(推荐):Android 10 (API 29) 引入了此官方 API。应用可以通过构建 AudioRecord 并添加 AudioPlaybackCaptureConfiguration 来复制其他应用正在播放的音频。出于安全考虑,使用该 API 需要 RECORD_AUDIO 权限,并且必须通过 MediaProjectionManager 弹窗让用户明确授权3。

REMOTE_SUBMIX:通过设置音频源为 MediaRecorder.AudioSource.REMOTE_SUBMIX 可以实现内录。但这属于系统级权限,通常需要应用具有系统签名(android:sharedUserId="android.uid.system")或厂商定制 ROM 支持。需要注意的是,开启此模式可能会截断扬声器和耳机的声音输出,导致本地无法听到播放的声音3。

. 音频调试与底层抓取(ADB Dump)

在开发和调试阶段,如果需要在不修改应用代码的情况下抓取 PCM 数据流,可以使用 ADB 命令:

AudioFlinger Dump:通过执行 adb shell dumpsys media.audio_flinger dump_pcm 命令,可以直接从 Android 的 AudioFlinger 服务中捕获原始 PCM 数据。该命令支持指定采样率、声道数、音频流类型(如 MUSIC)以及采集时长等参数5。

HAL 层 Dump:对于更底层的调试,可以通过设置特定的系统属性(如高通平台的 persist.vendor.audio.dump_data.in)让 HAL 层在写入数据时将 buffer 保存为 PCM 文件1。

. 其他音频采集方案

OpenSL ES:如果你需要更低的延迟或进行专业的音频处理,可以使用 NDK 级别的 OpenSL ES 接口。它的 API 相对复杂,但性能更高4。

MediaRecorder:适用于只需要将音频直接编码并保存到文件的简单场景,它会自动完成编码和存储,但无法像 AudioRecord 那样获取原始的 PCM 数据流6。

相关推荐
朱涛的自习室3 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
应用市场9 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭111999 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
geats人山人海10 小时前
java 7异常
android·java·开发语言
2601_9620710011 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
右手吉他12 小时前
高通平台IA APN问题分析之二
android·物联网
夜雪一千13 小时前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
不浪费一个字节13 小时前
一个纯 Python 实现的 APK 解析与设备操控工具箱
android
itmigrate13 小时前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
hai_android13 小时前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack