오디오 후킹
PlanetKit은 Planet Cloud가 상대방에게 오디오를 전송하기 전에 오디오 데이터를 가져올 수 있는 오디오 후킹(audio hooking) 기능을 제공합니다. 이 기능은 로컬 사용자의 음성을 변조하거나 오디오 데이터를 음성 인식에 활용하는 용도로 사용할 수 있습니다.
지원 통화 유형 | 최소 SDK 버전 |
---|---|
1대1 통화 | 5.5 |
개요
오디오 후킹 기능을 사용하기 위한 메서드는 PlanetKitCall
클래스에서 제공합니다.
오디오 후킹 활성화
오디오 후킹을 활성화하려면 IPlanetKitAudioHook
구현체를 인자로 EnableHookMyAudio()
를 호출하세요.
오디오 후킹이 활성화되면 OnHooked
이벤트를 통해 PlanetKitHookedAudio
객체를 받을 수 있습니다.
오디오 데이터 수정하기(선택 사항)
오디오 데이터를 수정하려면 다음 절차를 따르세요.
PlanetKitHookedAudio::GetAudioData()
를 호출하여 오디오 데이터를 획득하세요.- 획득한 오디오 데이터를 필요에 따라 수정하세요.
PlanetKitHookedAudio::SetAudioData()
를 호출하여 수정된 오디오 데이터를 설정하세요.
PlanetKitHookedAudio
클래스에서는 미가공(raw) 오디오 데이터만 수정할 수 있고, 채널, 샘플 수, 샘플 레이트, 샘플 유형, 시퀀스 번호와 같은 메타데이터는 변경할 수 없습니다. 미가공 오디오 데이터를 수정할 때는 반드시 메타데이터가 나타내는 형식을 유지해야 합니다.
오디오 데이터 돌려놓기
가져온 오디오 데이터를 다시 돌려놓으려면 PlanetKitHookedAudio
객체를 인자로 PutHookedMyAudioBack()
을 호출하세요.
오디오 후킹을 활성화한 후에는 오디오 데이터 수정 여부와 상관없이 반드시 가져온 오디오 데이터를 다시 돌려놓아야 합니다. 돌려놓지 않으면 상대방에게 오디오가 전달되지 않습니다.
오디오 후킹 비활성화
오디오 후킹을 비활성화하려면 DisableHookMyAudio()
를 호출하세요.
샘플 코드
다음 샘플 코드는 음성을 변조하기 위해 오디오 후킹 기능을 사용하는 방법을 보여줍니다.
// Implement audio modifier with IPlanetKitAudioHook
class MyAudioHook : public PlanetKit::IPlanetKitAudioHook {
public:
void OnHooked(PlanetKit::PlanetKitHookedAudioPtr pHookedAudio) {
const AudioData audioData = pHookedAudio->GetAudioData();
if(m_pAudioBuffer == nullptr) {
m_pAudioBuffer = new unsigned char[audioData.unBufferSize];
}
// Dump audio data
memcpy(m_pAudioBuffer, audioData.pBuffer, audioData.unBufferSize);
// Process `m_pAudioBuffer` as necessary
...
// Set modified data to pHookedAudio
pHookedAudio->SetAudioData(m_pAudioBuffer, audioData.unBufferSize);
// Put audio data back to PlanetKit
m_pCall->PutHookedMyAudioBack(pHookedAudio);
}
private:
unsigned char* m_pAudioBuffer = nullptr;
unsigned int m_unBufferSize = 0;
// Prepare instance of `PlanetKitCall`
PlanetKit::PlanetKitCallPtr m_pCall;
}
class MyApplication {
public :
// Method to enable audio hook
void EnableAudioHook() {
m_pCall->EnableHookMyAudio(&m_audioHook, this, [](void* pUserData, bool bSuccess){
if(bSuccess == true) {
OutputDebugStringW(L"Audio hook enabled successfully\n");
}
else {
OutputDebugStringW(L"Failed to enable audio hook\n");
}
});
}
// Method to disable the audio hook
void DisableAudioHook() {
m_pCall->DisableHookMyAudio(this, [](void* pUserData, bool bSuccess) {
if(bSuccess == true) {
// Successfully disabled audio hooking
OutputDebugStringW(L"Audio hook disabled successfully\n");
}
else {
OutputDebugStringW(L"Failed to disable audio hook\n");
}
});
}
private :
// Prepare instance of PlanetKitCall
PlanetKit::PlanetKitCallPtr m_pCall;
// Prepare instance of MyAudioHook
MyAudioHook m_audioHook;
};
관련 API
오디오 후킹과 관련된 API는 다음과 같습니다.