オーディオフック
PlanetKitは、オーディオフック(audio hooking)という機能を提供します。これは、Planet Cloudが相手にオーディオを転送する前にオーディオデータを取得(フック)する機能です。ローカルユーザーの音声を変えたり、オーディオデータを音声認識に活用したりする用途で使用できます。
対応する通話タイプ | SDKの最低バージョン |
---|---|
1対1通話 | 5.5 |
概要
オーディオフック機能を使用するためのメソッドは、PlanetKitCall
クラスで提供しています。
オーディオフックの有効化
オーディオフックを有効にするには、IAudioHook
の実装を引数としてEnableHookMyAudio()
を呼び出します。
オーディオフックが有効になると、OnHooked
イベントを通じてHookedAudio
オブジェクトを受け取ることができます。
オーディオデータの修正(オプション)
オーディオデータを修正するには、次の手順に従ってください。
HookedAudio::GetAudioData()
を呼び出してオーディオデータを取得してください。- 取得したオーディオデータを必要に応じて修正してください。
HookedAudio::SetAudioData()
を呼び出して修正されたオーディオデータを設定してください。
HookedAudio
クラスでは、未加工(raw)オーディオデータのみ修正できます。チャンネル、サンプル数、サンプルレート、サンプルタイプ、シーケンス番号のようなメタデータは変更できません。未加工オーディオデータを修正するには、必ずメタデータが示す形式を維持する必要があります。
オーディオデータの復元
フックしたオーディオデータを元に戻すには、HookedAudio
オブジェクトを引数としてPutHookedMyAudioBack()
を呼び出します。
オーディオフックを有効にした後は、オーディオデータの修正有無にかかわらず、フックしたオーディオデータを必ず元に戻す必要があります。そうしないと、相手にオーディオが転送されません。
オーディオフックの無効化
オーディオフックを無効にするには、DisableHookMyAudio()
を呼び出します。
サンプルコード
以下のサンプルコードは、音声を変えるためにオーディオフック機能を使用する方法を示しています。
// Implement audio modifier with IAudioHook
class MyAudioHook : public PlanetKit::IAudioHook {
public:
void OnHooked(PlanetKit::HookedAudioPtr 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
PlanetKit::SharedPtr<MyAudioHook> m_audioHook = PlanetKit::MakeAutoPtr<MyAudioHook>();
};
関連API
オーディオフックに関連するAPIは、以下のとおりです。