前言
实时音频传输过程中,通常会启动默认的音频模块进行采集和渲染。
然而在以下场景中,你可能会发现默认的音频模块无法满足开发需求:
- app 中已有自己的音频模块
- 需要使用自定义的前处理库
- 某些音频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略
- 多家sdk混用,共用一套音频采集模块
因此SDK支持使用自定义的音频源。实现相关场景。本文介绍如何实现自定义音频采集。
实现方法
参考步骤如下
- 调用 enterRoom 进房前,调用enableCustomAudioCapture(true)接口,面你需要使用音频自定义采集
- 开启后,开发者自行管理音频数据采集和处理。
- 完成音频数据处理后,再通过 sendCustomAudioData 发送给 SDK 进行后续操作。
注意:需要均匀地调用 sendCustomAudioData,保持20ms一次的频率,否则会导致声音出现断断续续的效果。
调用时序图
数据流转图
参考代码
参考以下代码在你的目中实现自定义音频采集。
该代码段基于Android的AudioRecord实现音频的自定义采集
/**
* 录音执行线程
*/
private class AudioRecordThread extends Thread {
private AudioRecord audioRecord;
private int bufferSize;
//参数初始化
AudioRecordThread() {
bufferSize = AudioRecord.getMinBufferSize(currentConfig.getSampleRate(),
currentConfig.getChannelConfig(), currentConfig.getEncodingConfig()) ;
Log.d(TAG, "record buffer size = " + bufferSize);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, currentConfig.getSampleRate(),
currentConfig.getChannelConfig(), currentConfig.getEncodingConfig(), bufferSize);
}
@Override
public void run() {
super.run();
startPcmRecorder();
}
private void startPcmRecorder() {
state = RecordState.RECORDING;
notifyState();
Log.d(TAG, "开始录制 Pcm");
try {
audioRecord.startRecording();
byte[] byteBuffer = new byte[bufferSize];
while (state == RecordState.RECORDING) {
audioRecord.read(byteBuffer, 0, byteBuffer.length);
//此处将数据发送出去给sdk
notifyData(byteBuffer);
}
audioRecord.stop();
if (state == RecordState.STOP) {
Log.i(TAG, "停止录音!");
} else {
Log.i(TAG, "暂停!");
}
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
notifyError("录音失败");
}
if (state != RecordState.PAUSE) {
state = RecordState.IDLE;
notifyState();
Log.d(TAG, "录音结束");
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END