【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。

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone4 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen4 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone4 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui