Skip to content

Commit 349bac9

Browse files
committed
增加16k降至8k进行重采样方式
1 parent e534d50 commit 349bac9

File tree

1 file changed

+39
-11
lines changed

1 file changed

+39
-11
lines changed

sdk/video-link-android/src/main/java/com/tencent/iot/video/link/util/audio/AudioRecordUtil.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)