【Android】TRTC使用AudioRecord实现自定义音频采集

前言

实时音频传输过程中,通常会启动默认的音频模块进行采集和渲染。
然而在以下场景中,你可能会发现默认的音频模块无法满足开发需求:

  1. app 中已有自己的音频模块
  2. 需要使用自定义的前处理库
  3. 某些音频采集设备被系统独占。为避免与其它业务产生冲突,需要灵活的设备管理策略
  4. 多家sdk混用,共用一套音频采集模块

因此SDK支持使用自定义的音频源。实现相关场景。本文介绍如何实现自定义音频采集。

实现方法

参考步骤如下

  1. 调用 enterRoom 进房前,调用enableCustomAudioCapture(true)接口,面你需要使用音频自定义采集
  2. 开启后,开发者自行管理音频数据采集和处理。
  3. 完成音频数据处理后,再通过 sendCustomAudioData 发送给 SDK 进行后续操作。

注意:需要均匀地调用 sendCustomAudioData,保持20ms一次的频率,否则会导致声音出现断断续续的效果。

调用时序图

1111.png

数据流转图

image.png

参考代码

参考以下代码在你的目中实现自定义音频采集。
该代码段基于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
喜欢就支持一下吧
点赞0 分享