场景
如果你的业务场景对声音有特殊要求,需要开发者对声音做一些定制化处理;目前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 | 音频时间戳 |