场景

如果你的业务场景对声音有特殊要求,需要开发者对声音做一些定制化处理;目前TRTC SDK提供发送自定义采集音频数据的接口,开发者可以自定采集音频数据,然后复用 trtc的编码功能,目前6.3.7版本sdk只支持48000采样率的单声道pcm数据,后续会发版支持更多的音频,可以留意一下我们官网的sdk更新;

示例一

AudioRecord 采集

1、需要根据配置参数,然后使用 AudioRecord 音频数据。

2、AudioRecord 采集到的音频数据不会回调给开发者,开发者需要启动一个线程每隔一段时间去读取音频数据。

private class AudioCaptureRunnable implements Runnable {
    @Override
    public void run() {
        while (!mIsLoopExit) {

            // 直接设置为 buffer size = 2048
            mMinBufferSize
            byte[] buffer = new byte[mMinBufferSize];

            int ret = mAudioRecord.read(buffer, 0, mMinBufferSize);

            if (ret == AudioRecord.ERROR_INVALID_OPERATION) {
                Log.e(TAG , "AudioRecord Error ERROR_INVALID_OPERATION");
            }
            else if (ret == AudioRecord.ERROR_BAD_VALUE) {
                Log.e(TAG , "AudioRecord Error ERROR_BAD_VALUE");
            }
            else {
                if (isPush) {
                    mLivePusher.sendCustomPCMData(buffer);
                }
            }
            SystemClock.sleep(10);
        }
    }
}
  • 用demo源码测试如图,在加入房间的时候打开自定义采集音频enableCustomAudioCapture,这边做了个简单的AudioRecord采集工具,直接调用;
  • startLocalAudio 开启本地音频流,并不指打开本地麦克风采集上传音频数据,当自定义音频采集开启时,sdk不打开麦克风采集,只是将声音数据上行,将音频数据广播给房间里的其他用户;

示例二

推采集好的pcm音频文件

1、注意文件需要是48000采样率的单声道pcm文件;

2、将pcm文件放在assets目录下,并调用

3、需要做一个定时器,定时往sdk塞音频数据,定时器间隔=(字节数 / 2 / 声道数) _1000 / 采样率 例如单声道,48K,(2048/2/1)_1000/48000=21

  • 注意,并不是做一个定时器无脑的给sdk塞音频数据,frame.timestampMs时间戳是做音视频对齐,如需对音频要求严谨,可以动态修正定时器时间,2次定时器的调用对比一下时间是否满足音频所需间隔时间;

完整的实例代码下载地址:建议将代码复制到腾讯云开发者demo中

方案原理

接口说明

void sendCustomAudioData(TRTCAudioFrame frame)

该接口是向 SDK 塞入您自定义采集和处理后的音频数据,请使用单声道的48000 PCM 声音数据。目前还不支持其他数据类型,后续会支持更多的音频采集类型;

  • TRTCAudioFrame参数说明
参数 类型 说明
data byte[] pcm 音频数据
sampleRate int 音频采样率
channel int 音频声道数
timestamp long 音频时间戳

文章来源于腾讯云开发者社区,点击查看原文