Android AudioRecord 的使用

Android AudioRecord 的使用,第1张

概述AudioRecord本工程实现pcm多配置(采样率、文件格式可选)的录音和播放工具,可用户音频的录制。工程代码:https://github.com/worson/AudioRecord.git录音参数在安卓应用中,使用AudioRecord可实现更灵活的录音配置,AudioRecord录制的是原始的pcm数据。AudioRecord的构造方 AudioRecord

本工程实现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 的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1068347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存