本工程实现pcm多配置(采样率、文件格式可选)的录音和播放工具,可用户音频的录制。
工程代码:https://github.com/worson/AudioRecord.git
录音参数在安卓应用中,使用AudioRecord可实现更灵活的录音配置,AudioRecord录制的是原始的pcm数据。
AudioRecord的构造方法如下:
AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
audioSource: 音频录制的音原,具体如下
MediaRecorder.AudioSource.CAMCORDER 设定录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风MediaRecorder.AudioSource.DEFAulT 默认音频源MediaRecorder.AudioSource.MIC设定录音来源为主麦克风。MediaRecorder.AudioSource.VOICE_CALL设定录音来源为语音拨出的语音与对方说话的声音MediaRecorder.AudioSource.VOICE_COMMUNICATION摄像头旁边的麦克风MediaRecorder.AudioSource.VOICE_DOWNlink下行声音MediaRecorder.AudioSource.VOICE_RECOGNITION语音识别MediaRecorder.AudioSource.VOICE_UPlink上行声音
sampleRateInHz:音频采样率,即可每秒中采集多少个音频数据
channelConfig: 录音通道,单通道为 AudioFormat.CHANNEL_CONfigURATION_MONO,双通道为AudioFormat.CHANNEL_CONfigURATION_STEREO
audioFormat: 音频每个采样点的位数,即音频的精度,通道选用AudioFormat.ENCoding_PCM_16BIT即pcm 16位即可
bufferSizeInBytes: 音频数据写入缓冲区的总数,通过 AudioRecord.getMinBufferSize 获取最小的缓冲区。
关于音频数据量的计算对于采样率为16k位深有16bit的录制参数,每秒钟的byte数为:16000*2=32000,即每分钟为:32000*60 byte/min= 1.875 MB/min的数据量
录音流程创建录音机public PcmRecorder(int audioSource, int sampleRate, int channelCnt, Context context, RecordListener Listener) { mListener = Listener; int channelConfig = channelCnt == 1 ? AudioFormat.CHANNEL_CONfigURATION_MONO : AudioFormat.CHANNEL_CONfigURATION_STEREO; int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, AUdio_FORMAT); mBufSize = minBufSize; int bufferSizeInBytes = minBufSize; AILog.i(TAG, "PcmRecorder: bufferSizeInBytes " + bufferSizeInBytes); mAudioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, AUdio_FORMAT, bufferSizeInBytes); AILog.d(TAG, "state: " + mAudioRecord.getState()); }
开始录音开始录音,并创建数据读取线程
public voID start() { AILog.d(TAG, "onStartRecord"); mAudioRecord.startRecording(); mRecording = true; mRecordThread = new RecordThread("RecordThread"); mRecordThread.start(); if (mListener != null) { mListener.onStartRecord(); } else { AILog.w(TAG, "start: mListener is null"); } }
读取音频数据不断读取 Buffer 中声音数据,并回调上层应用处理
class RecordThread extends Thread { public RecordThread(String name) { super(name); } @OverrIDe public voID run() { AILog.v(TAG, "thread run"); Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUdio); if (mAudioRecord.getState() == AudioRecord.STATE_UNINITIAliZED) { AILog.d(TAG, "unInit"); return; } byte[] buffer = new byte[mBufSize]; while (!mStopFlag) { int len = mAudioRecord.read(buffer, 0, buffer.length); if (len != mBufSize) { AILog.e(TAG, "record read error:" + len); } if (mListener != null) { mListener.onRecordData(buffer); continue; } } AILog.v(TAG, "thread end"); } }
停止录音停止录音并释放相关资源
public voID stop() { AILog.d(TAG, "stopRecord"); mStopFlag = true; mRecording = false; try { mRecordThread.join(); } catch (InterruptedException e) { AILog.d(TAG, "InterruptedException " + e.getMessage()); } finally { if (mListener != null) { mListener.onStopRecord(); } else { AILog.d(TAG, "stop: mListener is null"); } mAudioRecord.stop(); mAudioRecord.release(); } mListener = null; }
上层应用调用private voID startRecord() { AILog.i(TAG, "startRecord: "); checkEnvirement(); if (rb_channel_dual.isChecked()) { mRecorder = new PcmRecorder(getAudioSource(), getAudioFrequecy(), 2); } else { mRecorder = new PcmRecorder(getAudioSource(), getAudioFrequecy(), 1); } try { mOutputStream = new fileOutputStream(mTempRecordfile); mRecorder.setRecordListener(mRecordListener); mRecorder.start(); tv_tips.setText("正在录音..."); bt_recorder.setText("结束录音"); bt_play.setVisibility(VIEw.INVISIBLE); bt_delete.setVisibility(VIEw.INVISIBLE); } catch (fileNotFoundException e) { e.printstacktrace(); tv_tips.setText("录音启动失败..."); }}private RecordListener mRecordListener = new RecordListener() { @OverrIDe public voID onStartRecord() { AILog.i(TAG, "onStartRecord: "); } @OverrIDe public voID onRecordData(byte[] bytes) { try { mOutputStream.write(bytes); } catch (IOException e) { e.printstacktrace(); } } @OverrIDe public voID onStopRecord() { AILog.i(TAG, "onStopRecord: "); //保存文件 }};
点赞收藏分享文章举报老马行空发布了10 篇原创文章 · 获赞 0 · 访问量 9952私信 关注 总结 以上是内存溢出为你收集整理的Android AudioRecord 的使用全部内容,希望文章能够帮你解决Android AudioRecord 的使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)