@@ -42,6 +42,7 @@ public class AudioRecordUtil implements EncoderListener, FLVListener, Handler.Ca
4242 private static final int AEC_PCM_MIN_FRAME_SIZE = 640 ;
4343 private static final int DEFAULT_CHANNEL_CONFIG = AudioFormat .CHANNEL_IN_STEREO ; //设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
4444 private static final int DEFAULT_AUDIO_FORMAT = AudioFormat .ENCODING_PCM_16BIT ; //音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
45+ private static final int DEFAULT_AUDIO_SAMPLE_RATE = 16000 ; //音频数据16000采样率。保证设备支持。
4546 private static final String TAG = AudioRecordUtil .class .getName ();
4647 private static final int MSG_START = 1 ;
4748 private static final int MSG_STOP = 2 ;
@@ -137,6 +138,15 @@ public void handleMessage(Message msg) {
137138 }
138139 private final Handler mHandler = new MyHandler ();
139140
141+ public AudioRecordUtil (Context ctx , String id ) {
142+ context = ctx ;
143+ deviceId = id ;
144+ init (DEFAULT_AUDIO_SAMPLE_RATE , DEFAULT_CHANNEL_CONFIG , DEFAULT_AUDIO_FORMAT );
145+ readThread = new HandlerThread (TAG );
146+ readThread .start ();
147+ mReadHandler = new ReadHandler (readThread .getLooper (), this );
148+ }
149+
140150 public AudioRecordUtil (Context ctx , String id , int sampleRate ) {
141151 context = ctx ;
142152 deviceId = id ;
@@ -199,18 +209,18 @@ private void init(int sampleRate, int channel, int bitDepth) {
199209 } else if (bitDepth == AudioFormat .ENCODING_PCM_8BIT ) {
200210 this .encodeBit = 8 ;
201211 }
202- Log .e (TAG , "recordMinBufferSize is: " + recordMinBufferSize );
203- if (sampleRate == 8000 ) {
204- recordMinBufferSize = (sampleRate * this .channelCount * this .encodeBit / 8 ) / 1000 * 40 ; //40ms数据长度
205- Log .e (TAG , "40ms recordMinBufferSize is: " + recordMinBufferSize );
206- } else {
207- recordMinBufferSize = (sampleRate * this .channelCount * this .encodeBit / 8 ) / 1000 * 20 ; //20ms数据长度
208- Log .e (TAG , "20ms recordMinBufferSize is: " + recordMinBufferSize );
209- }
210- Log .e (TAG , "AudioRecordUtil init Pitch is: " + pitch );
212+ Log .e (TAG , "recordMinBufferSize is: " + recordMinBufferSize );
213+ recordMinBufferSize = (sampleRate * this .channelCount * this .encodeBit / 8 ) / 1000 * 20 ; //20ms数据长度
214+ Log .e (TAG , "20ms recordMinBufferSize is: " + recordMinBufferSize );
215+ Log .e (TAG , "AudioRecordUtil init Pitch is: " + pitch );
211216 GvoiceJNIBridge .init (context );
212217 }
213218
219+ private boolean isEnable8kEncode = false ;
220+ public void isEnable8kEncode (boolean isEnable8kEncode ) {
221+ this .isEnable8kEncode = isEnable8kEncode ;
222+ }
223+
214224 public void recordSpeakFlv (boolean isRecord ) {
215225 this .isRecord = isRecord ;
216226 if (isRecord && !TextUtils .isEmpty (speakFlvFilePath )) {
@@ -325,7 +335,7 @@ private void reset() {
325335 } else {
326336 audioRecord = new AudioRecord (MediaRecorder .AudioSource .MIC , sampleRate , channel , bitDepth , recordMinBufferSize );
327337 }
328- pcmEncoder = new PCMEncoder (sampleRate , channelCount , this , PCMEncoder .AAC_FORMAT );
338+ pcmEncoder = new PCMEncoder (isEnable8kEncode ? 8000 : sampleRate , channelCount , this , PCMEncoder .AAC_FORMAT );
329339 Log .e (TAG , "reset new FLVPacker" );
330340 flvPacker = new FLVPacker (this , true , false );
331341 int audioSessionId = audioRecord .getAudioSessionId ();
@@ -465,16 +475,34 @@ public void run() {
465475 if (isRecord ) {
466476 writePcmBytesToFile (buffer , playerPcmBytes , aecPcmBytes );
467477 }
478+ if (isEnable8kEncode ) {
479+ aecPcmBytes = downSample16kTo8k (aecPcmBytes );
480+ }
468481 pcmEncoder .encodeData (aecPcmBytes );
469482 } else {
470- pcmEncoder .encodeData (buffer );
483+ if (isEnable8kEncode ) {
484+ byte [] sample8kPcmBytes = downSample16kTo8k (buffer );
485+ pcmEncoder .encodeData (sample8kPcmBytes );
486+ } else {
487+ pcmEncoder .encodeData (buffer );
488+ }
471489 }
472490 }
473491 }
474492 }
475493 }
476494 }
477495
496+ public byte [] downSample16kTo8k (byte [] pcm16k ) {
497+ int len8k = pcm16k .length / 4 ; // 2字节一个采样,丢一半
498+ byte [] pcm8k = new byte [len8k * 2 ];
499+ for (int i = 0 ; i < len8k ; i ++) {
500+ pcm8k [i * 2 ] = pcm16k [i * 4 ];
501+ pcm8k [i * 2 + 1 ] = pcm16k [i * 4 + 1 ];
502+ }
503+ return pcm8k ;
504+ }
505+
478506 public boolean isDevicesSupportAEC () {
479507 return AcousticEchoCanceler .isAvailable ();
480508 }
0 commit comments