Dana
6 天以前 f8e07136a73a1723c2c9cdd13b8928c0e7cdf5aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.safeluck.floatwindow.util;
 
 
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * aaa
 * Created by lzw on 2019/8/29. 11:19:57
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public class AudioRecordManager {
 
    private static final String TAG = "AudioRecordManager";
    private static AudioRecordManager instance;
 
    /***标记是否正在录音**/
    private boolean isRecording = false;
 
    private AudioRecord audioRecord;
    /***最小缓冲区大小*/
    private int bufferSize = 0;
    /***采样率*/
    private int sampleRateInHz = 32000;
    /***量化位数**/
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
    /***存放音频数据的buffer**/
    private byte[] buffer;
 
    private int channelConf = AudioFormat.CHANNEL_IN_STEREO;
    private OnAudioRecordListener onAudioRecordListener;
 
 
    private AudioRecordManager() {
        //计算最小缓冲区
        bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConf, audioFormat);
//        bufferSize = bufferSize > 320 ? 320 : bufferSize;
        Log.i(TAG,"mini buffersize="+bufferSize);
 
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConf, audioFormat, bufferSize);
    }
 
 
    public static AudioRecordManager getInstance() {
        if (instance == null) {
            synchronized (AudioRecordManager.class) {
                if (instance == null) {
                    instance = new AudioRecordManager();
                }
            }
        }
        return instance;
    }
 
    /***
     * 开始采集音频
     */
    public void startRecording(final OnAudioRecordListener onAudioRecordListener) {
        setAudioRecordListener(onAudioRecordListener);
        if (audioRecord == null){
            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConf, audioFormat, bufferSize);
        }
        buffer = new byte[bufferSize];
 
                isRecording = true;
                audioRecord.startRecording();
                try {
                    while (isRecording){
                        int readSize = audioRecord.read(buffer,0,bufferSize);
                        Log.i(TAG, "run: buffer length"+buffer.length+" readSize="+readSize);
                        if (onAudioRecordListener != null){
                            onAudioRecordListener.onVoiceRecord(buffer,bufferSize);
                        }
                    }
                    audioRecord.stop();
                    destroy();
                } catch (Exception e) {
                    e.printStackTrace();
                }
 
 
    }
 
    /***
     * 停止音频采集
     */
    public void stopRecording(){
        Log.i(TAG, "stopRecording");
        isRecording = false;
        setAudioRecordListener(null);
    }
 
    public void destroy(){
        if (audioRecord!=null){
            audioRecord.release();
            audioRecord = null;
        }
 
    }
 
    public interface OnAudioRecordListener {
        /***
         * 采集到的音频信息回调到上层
         * @param data
         * @param size
         */
        void onVoiceRecord(byte[] data,int size);
    }
 
    private void setAudioRecordListener(OnAudioRecordListener onAudioRecordListener){
        this.onAudioRecordListener = onAudioRecordListener;
    }
 
}