自定义音频采集和播放
本文档主要介绍如何使用 TRTC SDK 实现自定义音频采集和获取,分为:音频采集、音频获取两个部分。
自定义音频采集
TRTC SDK 的自定义音频采集功能的开启分为两步,即:开启功能、发送音频帧给 SDK,具体 API 使用步骤见下文,同时我们也提供有对应平台的的 API-Example:
开启自定义音频采集功能
首先,您需要调用 TRTCCloud 的
enableCustomAudioCapture
接口开启 TRTC SDK 自定义音频采集的功能,示例代码如下:TRTCCloud mTRTCCloud = TRTCCloud.shareInstance();mTRTCCloud.enableCustomAudioCapture(true);
self.trtcCloud = [TRTCCloud sharedInstance];[self.trtcCloud enableCustomAudioCapture:YES];
liteav::ITRTCCloud* trtc_cloud = liteav::ITRTCCloud::getTRTCShareInstance();trtc_cloud->enableCustomAudioCapture(true);
发送自定义音频帧
然后您就可以使用 TRTCCloud 的
sendCustomAudioData
接口向 TRTC SDK 填充您自己的声音数据,示例代码如下:TRTCCloudDef.TRTCAudioFrame trtcAudioFrame = new TRTCCloudDef.TRTCAudioFrame();trtcAudioFrame.data = data;trtcAudioFrame.sampleRate = sampleRate;trtcAudioFrame.channel = channel;trtcAudioFrame.timestamp = timestamp;mTRTCCloud.sendCustomAudioData(trtcAudioFrame);
TRTCAudioFrame *audioFrame = [[TRTCAudioFrame alloc] init];audioFrame.channels = audioChannels;audioFrame.sampleRate = audioSampleRate;audioFrame.data = pcmData;[self.trtcCloud sendCustomAudioData:audioFrame];
liteav::TRTCAudioFrame frame;frame.audioFormat = liteav::TRTCAudioFrameFormatPCM;frame.length = buffer_size;frame.data = array.data();frame.sampleRate = 48000;frame.channel = 1;getTRTCShareInstance()->sendCustomAudioData(&frame);
注意:
使用
sendCustomAudioData
有可能会导致回声抵消(AEC)的功能失效。获取音频原数据
声音模块是一个高复杂度的模块,SDK 需要严格控制声音设备的采集和播放逻辑。在某些场景下,当您需要获取远程用户的音频数据或者需要获取本地麦克风采集到的音频数据时,可以通过 TRTCCloud 对应的不同平台的接口,我们也提供有对应平台的的 API-Example:
Android:
设置音频回调函数
mTRTCCloud.setAudioFrameListener(new TRTCCloudListener.TRTCAudioFrameListener() {@Overridepublic void onCapturedRawAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {}@Overridepublic void onLocalProcessedAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {}@Overridepublic void onRemoteUserAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame, String s) {}@Overridepublic void onMixedPlayAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {}@Overridepublic void onMixedAllAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {// 详见TRTC-API-Example 中自定义渲染的工具类:com.tencent.trtc.mediashare.helper.CustomFrameRender}});
[self.trtcCloud setAudioFrameDelegate:self];// MARK: - TRTCAudioFrameDelegate- (void)onCapturedRawAudioFrame:(TRTCAudioFrame *)frame {NSLog(@"onCapturedRawAudioFrame");}- (void)onLocalProcessedAudioFrame:(TRTCAudioFrame *)frame {NSLog(@"onLocalProcessedAudioFrame");}- (void)onRemoteUserAudioFrame:(TRTCAudioFrame *)frame userId:(NSString *)userId {NSLog(@"onRemoteUserAudioFrame");}- (void)onMixedPlayAudioFrame:(TRTCAudioFrame *)frame {NSLog(@"onMixedPlayAudioFrame");}- (void)onMixedAllAudioFrame:(TRTCAudioFrame *)frame {NSLog(@"onMixedAllAudioFrame");}
// 设置音频数据自定义回调liteav::ITRTCCloud* trtc_cloud = liteav::ITRTCCloud::getTRTCShareInstance();trtc_cloud->setAudioFrameCallback(callback)// 音频数据自定义回调virtual void onCapturedRawAudioFrame(TRTCAudioFrame* frame) {}virtual void onLocalProcessedAudioFrame(TRTCAudioFrame* frame) {}virtual void onPlayAudioFrame(TRTCAudioFrame* frame, const char* userId) {}virtual void onMixedPlayAudioFrame(TRTCAudioFrame* frame) {}
注意:
不要在上述回调函数中做任何耗时操作,建议直接拷贝,并通过另一线程进行处理,否则会导致声音断断续续或者回声抵消(AEC)失效的问题。
上述回调函数中回调出来的数据都只允许读取和拷贝,不能修改,否则会导致各种不确定的后果。