快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

11|Android 平台音频采集:如何使用 AudioRecord 和 Oboe 采集音频?

你好,我是展晓凯。今天我们来一起学习 Android 平台的音频采集。
视频播放器是将一个视频文件通过解封装、解码、渲染等工作,让用户可以听到声音、看到画面,而视频录制器恰恰是一个逆向的过程,是将麦克风采集到的声音、摄像头采集到的画面通过编码、封装,最终得到一个视频文件。所以整个项目的前置知识包括音视频的采集、编码还有音视频同步等,上一节课我们一起学习了 iOS 平台的音频采集方法,这节课我们就一起来看 Android 平台给我们提供了哪些音频采集的方法吧。

Android 平台的音频采集技术选型

SDK 层提供的采集方法

Android SDK 提供了两套音频采集的 API 接口,分别是 MediaRecorder 和 AudioRecord。前者是一个端到端的 API,它可以直接把手机麦克风录入的音频数据进行编码压缩(如 AMR、MP3 等)并存储成文件;而后者则更底层一些,可以让开发者更加灵活地控制麦克风采集到的 PCM 数据。
如果想简单地做一个录音机,并且录制出一个音频文件,首选肯定是 MediaRecorder,而如果需要对音频做进一步的算法处理,或者需要采用第三方的编码库进行编码压缩,那么就需要使用 AudioRecord 了。我们的视频录制器场景显然更适合选用第二种方式,使用 AudioRecord 来采集音频。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Android平台音频采集技术涵盖了SDK层和NDK层提供的方法。SDK层提供了MediaRecorder和AudioRecord两种API接口,适用于简单录音和对PCM数据进行灵活控制的场景。而NDK层提供了OpenSL ES和AAudio接口,具有更低延迟和更高性能,适合实时耳返和VOIP场景。建议构建音频采集框架的工程同时支持SDK层和NDK层的采集方法。在Native层,使用Google开源的Oboe框架是一个不错的选择,它提供了统一的API接口,屏蔽了底层实现细节。文章内容涵盖了Android平台音频采集的技术选型、权限获取和PCM数据处理,适合开发人员快速了解Android音频采集的方法和注意事项。 在实现实时耳返功能时,关键在于低延迟的处理。为了实现这一功能,可以采用立即播放采集到的音频的方法。通过合理的音频处理和播放策略,可以减少延迟,提高用户体验。欢迎在评论区分享你的思考,也欢迎你把这节课分享给更多对音视频感兴趣的朋友,我们一起交流、共同进步。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:SDK层的MediaRecorder是对AudioRecord的封装吗? Q2:NDK层的AAudio是基于OpenSL ES吗?(或者说,AAudio是对OpenSL ES的封装吗) Q3:SDK层的方法,都是基于NDK层的方法吗? 比如SDK层的MediaRecorder是基于NDK层的AAudio或OpenSL ES。 Q4:默认的麦克风等于主麦克风吗? Q5:AEC是什么意思? 文中有一句“在 VOIP 场景下如果使用硬件 AEC 的话”,其中的AEC什么意思? Q6:单声道采集,转换为立体声,也是伪立体声吧。是把单声道的数据拷贝一份变成另外一个声道吗? Q7:read函数的数组类型,需要根据audioFormat来确定吧。如果audioFormat是8位,应该用byte[], 如果audioFormat是16位,则应该用short[],是这样吗? Q8:播放PCM的命令中,哪一项是表示PCM? ffplay -f s16le -sample_rate 44100 -channels 1 -i vocal.pcm,s16le表示什么意思?表示PCM吗? Q9:PCM转WAV的命令中,哪一项是表示WAV? ffmpeg -f s16le -sample_rate 44100 -channels 1 -i vocal.pcm -acodec pcm_s16le vocal.wav,哪一项是表示wav?pcm_s16se吗? Q10:用两种采集方法,是播放器项目会同时采用这两种吗? 选取了 SDK 层的 AudioRecord 和 Native 层的 Oboe 采集音频的方法,只是为了分别说明这两种方法吗? 还是说播放器项目会同时采用这两种方法来采集音频?(同时用两种,好像没有道理)

    作者回复: A1: 是的; A2:不是 A3:我觉得不是,没有了解过特别细节; A4:是的,一般是手机硬件底部的麦克风; A5:回声消除,可以自行搜索; A6:一般通过混响或者其他的效果器变为双声道,否则没意义; A7:不是,audioFormat是16位,仍然可以使用byte数组的读出方式; A8:vocal.pcm是那个pcm文件,s16le代表Sint16 little endian A9:vocal.wav是目标文件 A10:播放器项目是不会开启路引起的,一般选用一种就可以了,不过看场景,比如K歌场景在项目中会同时集成多种的,根据一些配置来选择使用哪一种。

    2022-08-17归属地:北京
  • Loy
    老师,你好。低延时耳返需要底层特殊定制吗?
    2023-04-06归属地:福建
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部