본문에서는 사용자 정의 오디오 캡처 및 렌더링을 구현하기 위해 TRTC SDK를 사용하는 방법을 설명합니다.
사용자 정의 오디오 캡처
TRTC SDK의 사용자 정의 오디오 캡처 기능은 기능 활성화와 SDK에 오디오 프레임 전송의 두 단계로 사용할 수 있습니다. 특정 API에 대한 자세한 안내는 아래를 참고하십시오. 또한 다양한 플랫폼에 대한 API-Example을 제공합니다.
사용자 정의 오디오 캡처 활성화
TRTC SDK의 사용자 정의 오디오 캡처 기능을 활성화하려면 TRTCCloud의 enableCustomAudioCapture
API를 호출해야 합니다. 아래는 샘플 코드입니다.
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' API를 사용하여 자신의 오디오 데이터로 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) 기능이 적용되지 않을 수 있습니다.
오디오 원본 데이터 획득
오디오 모듈은 매우 복잡한 모듈이며 TRTC SDK는 오디오 장치의 캡처 및 재생 로직을 엄격하게 제어해야 합니다. 경우에 따라 원격 사용자의 오디오 데이터 또는 로컬 마이크에 의해 캡처된 오디오 데이터를 가져오기 위해 다른 플랫폼용 TRTCCloud의 API를 사용할 수 있습니다. 또한 다음과 같은 플랫폼에 대한 API-Example도 제공합니다.
오디오 콜백 설정
mTRTCCloud.setAudioFrameListener(new TRTCCloudListener.TRTCAudioFrameListener() {
@Override
public void onCapturedRawAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {
}
@Override
public void onLocalProcessedAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {
}
@Override
public void onRemoteUserAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame, String s) {
}
@Override
public void onMixedPlayAudioFrame(TRTCCloudDef.TRTCAudioFrame trtcAudioFrame) {
}
@Override
public 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) 기능이 적용되지 않을 수 있습니다.
상기 콜백 함수에서 콜백하는 데이터는 모두 읽기 및 복사가 가능하며 수정은 불가능합니다. 수정할 경우 알 수 없는 결과가 나타날 수 있습니다.
문제 해결에 도움이 되었나요?