音视频 — AudioRecorder 和 AudioTrack
MediaRecorder: 录制的音频文件是经过压缩后的,需要设置编码器。并且录制的音频文件可以用系统自带的Music播放器播放。
优点: 官方提供 API
缺点: 不能实时处理音频,输出格式不多,且PCM可以处理生成
AudioRecord: 录制的是PCM格式的音频文件,需要用AudioTrack来播放。
优点: 可以实时获取音频的数据做到边录边播放,可以对获取的音频做处理,压缩,传输等
缺点: 输出的是原始数据 PCM 所以播放器不能播放,需要通过AudioTrack处理
采集音频的步骤:
1.配置 AudioRecorder 构造函数的参数
2.初始化缓冲区
3.开始采集 ,子线程里将缓冲区的数据取出,写入文件流
4.停止采集,释放资源
audioSource: 音频采集的输入源,可选的值以常量的形式定义在 MediaRecorder.AudioSource 类中,例如:MIC(由手机麦克风输入),VOICE_COMMUNICATION(用于VoIP应用)等等。
sampleRateInHz: 采样率,注意,目前44100Hz是唯一可以保证兼容所有Android手机的采样率。
channelConfig: 通道数的配置,可选的值以常量的形式定义在 AudioFormat 类中,常用的是CHANNEL_IN_MONO(单通道),CHANNEL_IN_STEREO(双通道)
audioFormat: 返回的音频数据的格式,可选的值也是以常量的形式定义在 AudioFormat 类中,常用的是 ENCODING_PCM_16BIT(16bit),ENCODING_PCM_8BIT(8bit),注意,前者是可以保证兼容所有Android手机的。
bufferSizeInBytes: AudioRecord 内部的音频缓冲区的大小,该缓冲区的值不能低于一帧“音频帧”(Frame)的大小
参数配置:
AudioRecord 提供了一个类为我们计算最小缓冲区,参数就是我们上面配置的 采样率,声道, 返回的音频数据的格式
直接调用创建好的 AudioRecorder 对象的 startRecording();
开始播放步骤:
1.配置参数
2.配置缓冲区
3.开启子线程,把缓冲区读数据转换成输入流,再调用AudioTrack读 write()写入数据,最后调用 play()
4.结束释放资源
参数和 AudioRecorder 差不多,有区别的就是 AudioTrack 是输出声道,还要播放的类型,和播放的模式
streamType: 播放的类型,都定义在 AudioManager 类中
mode: 播放的模式, MODE_STATIC, MODE_STREAM 两种
两者的区别
和上面的 AudioRecorder 的配置一样
Demo https://github.com/wubobo952/LearnAudio