AudioRecord api的初步认知

本文详细解析了Android中AudioRecord的使用方法及参数配置,包括录音原理、API介绍与录音数据处理流程,适合音视频开发者深入理解。
相比AudioTrack作用播音,AudioRecord的作用就是用来录音的。api也简单易懂,使用过程中根据自身需求获取相应录音通道的PCM音频数据。

1、用AudioRecord录制(read方法)下来直接保存在文件中的音频是PCM音频,也就是源音频,播放器没办法直接播放,需要转换为某一格式的音频。例如转为wave格式即可(在源文件前加44个字节来描述该音频------采样率、通道数、位宽等)。
2、AudioRecord没有暂停和继续录音的方法,只有start和stop。

adts头 ------ 7个字节

wave header ------44个字节

AudioRecord初始化
  • AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
  1. audioSource:音频来源(mic);
  2. sampleRateInHz:采样率(16KHz 、44.1KHz)
  3. channelConfig:录音通道数
  4. audioFormat:位宽
  5. bufferSizeInBytes:缓冲区大小(AudioRecord.getMinBufferSize()可以拿到)
  • AudioRecord.getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat):
  1. sampleRateInHz:采样率(16KHz 、44.1KHz)
  2. channelConfig:录音通道数
  3. audioFormat:位宽
AudioRecord方法

audioParamCheck(int audioSource, int sampleRateInHz,
int channelConfig, int audioFormat):
检查以下参数,无问题则设置。有问题抛出异常。

  1. mRecordSource is valid
  2. mChannelCount is valid
  3. mChannelMask is valid
  4. mAudioFormat is valid
  5. mSampleRate is valid
  • audioBuffSizeCheck(int audioBufferSize):
    检查缓冲区大小,无问题则设置。有问题抛出异常。
  • release():释放AudioRecord资源,release之后AudioRecord置为null。
  • int getSampleRate():返回采样率Hz
  • int getAudioSource():返回录音源信息
  • int getAudioFormat():位宽
  • int getChannelConfiguration():CHANNEL_IN_MONO(单声道) CHANNEL_IN_STEREO(立体声)
  • int getChannelCount()
  • int getState():实例是否初始化好。STATE_INITIALIZED(已准备好) STATE_UNINITIALIZED(未准备好)
  • int getRecordingState():是否在录音。RECORDSTATE_STOPPED(停止录音) RECORDSTATE_RECORDING(录音)
  • int getNotificationMarkerPosition():通知标志位
  • int getPositionNotificationPeriod():标志位更新时间
  • int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat):需要的最新缓冲区。
  • int getAudioSessionId():当前AudioRecord的属于的任务id
  • startRecording():开始录音
  • startRecording(MediaSyncEvent syncEvent):从一个特定的录音源录音
    stop():停止录音
  • int read(byte[] audioData, int offsetInBytes, int sizeInBytes):读取录音数据写入audioData从偏移量offsetInBytes到sizeInBytes
  • int read(short[] audioData, int offsetInShorts, int sizeInShorts):读取录音数据到audioData
  • int read(ByteBuffer audioBuffer, int sizeInBytes):读取录音数据到audioBuffer
  • setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener)
  • setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener,
    Handler handler):设置回调监听

接口定义为:当AudioRecord 收到一个由setNotificationMarkerPosition(int)设置的通知标志,或由 setPositionNotificationPeriod(int)设置的周期更新记录的进度状态时,回调此接口。

public interface OnRecordPositionUpdateListener  {
    /**
     * Called on the listener to notify it that the previously set marker has been reached
     * by the recording head.回调监听器,通知监听器已经到达之前设置的标记位置。
     */
    void onMarkerReached(AudioRecord recorder);

    /**
     * Called on the listener to periodically notify it that the record head has reached
     * a multiple of the notification period.按照一定的周期,通知监听器,指定的记录已经就绪。
     */
 	   void onPeriodicNotification(AudioRecord recorder);
}
参考链接http://www.cnblogs.com/Amandaliu/archive/2013/02/04/2891604.html 在链接内容基础上修改了amr编码格式为aac编码格式 Android提供了两个API用于实现录音功能:android.media.AudioRecord、android.media.MediaRecorder。 网上有很多谈论这两个类的资料。现在大致总结下: 1、AudioRecord 主要是实现边录边播(AudioRecord+AudioTrack)以及对音频的实时处理(如会说话的汤姆猫、语音) 优点:语音的实时处理,可以用代码实现各种音频的封装 缺点:输出是PCM语音数据,如果保存成音频文件,是不能够被播放器播放的,所以必须先写代码实现数据编码以及压缩 示例: 使用AudioRecord类录音,并实现WAV格式封装。录音20s,输出的音频文件大概为3.5M左右(已写测试代码) 2、MediaRecorder 已经集成了录音、编码、压缩等,支持少量的录音音频格式,大概有.aac(API = 16) .amr .3gp 优点:大部分以及集成,直接调用相关接口即可,代码量小 缺点:无法实时处理音频;输出的音频格式不是很多,例如没有输出mp3格式文件 示例: 使用MediaRecorder类录音,输出amr格式文件。录音20s,输出的音频文件大概为33K(已写测试代码) 3、音频格式比较 WAV格式:录音质量高,但是压缩率小,文件大 AAC格式:相对于mp3,AAC格式的音质更佳,文件更小;有损压缩;一般苹果或者Android SDK4.1.2(API 16)及以上版本支持播放 AMR格式:压缩比比较大,但相对其他的压缩格式质量比较差,多用于人声,通话录音 至于常用的mp3格式,使用MediaRecorder没有该视频格式输出。一些人的做法是使用AudioRecord录音,然后编码成wav格式,再转换成mp3格式 再贴上一些测试工程。 功能描述: 1、点击“录音WAV文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.wav 2、点击“录音AMR文件”,开始录音。录音完成后,生成文件/sdcard/FinalAudio.amr 3、点击“停止录音”,停止录音,并显示录音输出文件以及该文件大小。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值