Android 录音的3种方式,1.调用系统录音,2.AudioRecord,3.MediaRecoder

1.调用系统的录音机并返回录制结果

https://blog.csdn.net/yu540135101/article/details/103655058

2.使用AudioRecord返回PCM数据

package com.zhangyu.myopengl.encoder;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;

public class AudioRecordUtil {

    private static final String TAG = "AudioRecordUtil";
    private AudioRecord audioRecord;
    private int bufferSize;
    private int readSize;
    private boolean isStart;

    private int sample_rate = 44100;

    public AudioRecordUtil() {
        bufferSize = AudioRecord.getMinBufferSize(
                sample_rate,
                AudioFormat.CHANNEL_IN_STEREO,
                AudioFormat.ENCODING_PCM_16BIT);
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                sample_rate,
                AudioFormat.CHANNEL_IN_STEREO,
                AudioFormat.ENCODING_PCM_16BIT,
                bufferSize);
    }

    private OnRecordListener onRecordListener;

    public void setOnRecordListener(OnRecordListener onRecordListener) {
        this.onRecordListener = onRecordListener;
    }

    public interface OnRecordListener {
        void isStart();
        void readByte(byte[] audioData, int size);
    }

    /**
     * 开始
     */
    public void startRecord() {
        new Thread(new Runnable() {
            @Override
            public void run() {

                isStart = true;
                audioRecord.startRecording();
                byte[] audioData = new byte[bufferSize];
                if (onRecordListener != null) {
                    onRecordListener.isStart();
                }
                while (isStart) {
                    readSize = audioRecord.read(audioData, 0, bufferSize);
                    if (onRecordListener != null) {
                        onRecordListener.readByte(audioData, readSize);
                    }
                }
                //释放
                audioRecord.stop();
                audioRecord.release();
                audioRecord = null;

            }
        }).start();
    }

    /**
     * 停止
     */
    public void stopRecord() {
        isStart = false;
    }
}

3.使用MediaRecorder录制

package com.zhangyu.myopengl.utils;

import android.content.Context;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.IOException;

public class MediaRecorderUtil {

    private static final String TAG = "MediaRecorderUtil";

    private String path;
    private MediaRecorder recorder;

    private Type type = Type.AAC_AAC;

    /**
     * 枚举了两种常用的类型
     */
    public enum Type {
        AAC_M4A(".m4a", MediaRecorder.AudioEncoder.AAC, MediaRecorder.OutputFormat.MPEG_4),
        AAC_AAC(".aac", MediaRecorder.AudioEncoder.AAC, MediaRecorder.OutputFormat.AAC_ADTS),
        AMR_AMR(".amr", MediaRecorder.AudioEncoder.AMR_NB, MediaRecorder.OutputFormat.AMR_NB);
        String ext;
        int audioEncoder;
        int outputFormat;
        Type(String ext, int audioEncoder, int outputFormat) {
            this.ext = ext;
            this.audioEncoder = audioEncoder;
            this.outputFormat = outputFormat;
        }
    }

    /**
     * 初始化
     * @param context
     */
    public MediaRecorderUtil(Context context) {
        String fileName = "recorder_" + System.currentTimeMillis() + type.ext;
        Log.e(TAG, "MediaRecorderUtil: fileName=" + fileName);
//        String fileDir = context.getFilesDir() + "/record";
        String fileDir = Environment.getExternalStorageDirectory() + "/1";
        File file = new File(fileDir);
        //判断文件夹是否存在,如果不存在则创建文件夹
        if (!file.exists()) {
            file.mkdirs();
        }
        file = new File(fileDir, fileName);
        path = file.getAbsolutePath();
    }

    /**
     * 开始录制
     */
    public void start() {
        try {
            recorder = new MediaRecorder();
            recorder.setOutputFile(path);
            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            recorder.setOutputFormat(type.outputFormat);
            recorder.setAudioEncoder(type.audioEncoder);
            recorder.prepare();
            recorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 停止录制
     */
    public void stop() {
        if (recorder != null) {
            recorder.stop();
            recorder.release();
            recorder = null;
        }
    }

    /**
     * 获取音频的振幅
     * @return
     */
    public float getVoiceLevel() {
        float level = 0.1f;
        try {
            if (recorder != null) {
//                getMaxAmplitude()的范围是 1-32767
//                mediaRecorder.getMaxAmplitude()/32768 占总量的百分比
//                这里7*mediaRecorder.getMaxAmplitude()/32768 的最大值为6
                level = recorder.getMaxAmplitude() / 32768f;
                return level;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return level;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值