简介
- AudioRecorder,可以采集PCM格式的原始音频文件,对PCM格式数据,根据一定的协议约定,可以转换成wav格式等其他格式;
- AudioTrack,可以直接播放PCM格式的文件,也就是说上面利用AudioRecorder生成的原始文件可以通过AudioTrack直接播放;
- MediaRecorder,可以录制音频,也可以配合相机(Camera)录制视频,相比较而言,MediaRecorder功能更丰富,更易用,使用场景也更多,而AudioRecorder和AudioTrack则更底层一点,且功能存在局限性。
- [x] 音视频基础0——目录
- [x] 音视频基础1——AudioTrack、AudioRecorder、MediaRecorder音频数据采集播放处理
- [ ] 音视频基础2——Android Camera API及Camera2 API的使用
- [ ] 音视频基础3——Android Camera API及Camera2 采集视频数据
- [ ] 音视频基础4——Android MediaCodec API学习
- [ ] 音视频基础5——Android 实现rtmp推流
- [x] 音视频基础6——交叉编译动态库
- [ ] 音视频基础7——MacOs下编译FFMpeg4.2.2
下面分别介绍 这三个音频采集过程中常用的类。
AudioRecord
AudioRecord的说明比较简单,构造好后,通过其read系列方法,从指定的硬件源中读取数据到缓存中(这个缓存的大小的最小值由 采样率 通道数 音频数据类型 的值获取而来),然后将其写入到文件,这个原始的文件就是PCM文件,再根据媒体格式之间的转换协议,做下转换,就可以得到其他格式的文件了。
由于比较简单,这里直接贴上我针对AudioRecord封装的代码。
1 | public class AudioRecordWrapper { |
使用时需要注意一下几点:
- 请确保你获取到了麦克风权限;
- 读取文件的IO操作请放到子线程中进行;
- 注意资源的释放;
- 不要过于依赖其提供的状态来进行业务上的判断,最好自己维护。
AudioTrack
AudioTrack类管理和播放Java应用程序的单个音频资源。它允许将PCM音频缓冲区流传输到音频接收器以进行播放。
AudioTrack
有两种工作模式:MODE_STATIC
& MODE_STREAM
。
MODE_STATIC
,静态播放,一次性全部加载到内存播放,这就要求播放的文件小,适用场景自然是短音频;MODE_STREAM
,流式播放,将PCM音频数据读入到输入流,然后不断从输入流中读取数据进行播放,可以播放大文件;
AudioTrack使用时有一点需要注意,AudioTrack每次能播放多少数据取决于buffer设置:
MODE_STATIC
模式下,buffer大小是播放声音的最大大小;MODE_STREAM
模式下,buffer取决于读取数据是采用的totalBufferSize(计算出来的)大小;
AudioTrack虽然提供了getState这个方法来获取当前的状态,但我们实际上并不能依据该状态来进行判断,因为需要调用系统硬件都是采用异步形式,我们不能准确的获取到当前的状态,一般需要自己定义一个变量来表示状态。
下面是对AudioTrack
的封装,构造好AudioTrackWrapper
后,调用start
方法即可播放传入的PCM文件,调用stop
方法即可停止播放,注意调用完毕后记得调用release释放资源。(ThreadUtils
为封装的一个线程操作工具类)
1 | /** |
MediaRecorder
MediaRecorder用来录制音频和视频的,使用比较广,音视频的录制控制基于下面这个状态机:
所以在使用的时候要严格控制函数的调用顺序,否则很容易产生IllegalStateException
。录制音频的一般调用循序如下所示:
1 | MediaRecorder mediaRecorder = new MediaRecorder(); |
录制视频大体和录制音频相同,知识需要加上视频源设置、视频输出格式、视频编码、以及预览的容器,具体如下:
1 | MediaRecorder mediaRecorder = new MediaRecorder(); |
下面贴出利用MediaRecorder录制音频的代码片段:
1 | private File outPutFile; |
总结
以上就是Android音频采集相关的内容,AudioRecord主要负责音频采集,AudioTrack负责pcm数据的播放,MediaRecorder既可以进行音频采集,也可以配合CameraApi进行视频采集,视频采集会加接下来的文章中讲到。