バージョン
menu_open
Wwise SDK 2023.1.3
Wwiseのオフラインレンダリング

オフラインレンダリング

Wwise Sound Engineは、計算負荷の高いリアルタイムで行わないオーディオ生成や、計算負荷の高い動画生成に同期したオーディオ処理のための、オフラインレンダリングを提供しています。

注意: 同期的な AK::SoundEngine::LoadBankAK::SoundEngine::UnloadBank のAPIを使うアプリケーションでオフラインレンダリングを有効にする場合は、特に注意する必要があります。詳細は Audio Rendering Thread を参照してください。

オーディオキャプチャのコールバックを、レンダリングされたオーディオバッファをアクセスする方法を提供する AK::SoundEngine::RegisterCaptureCallback を使い、登録することができます。

以下は、オフラインレンダリングの1つの実装方法を示す例です:

/// ゲームコードでアクセスできる動画キャプチャサービス
namespace VideoCaptureServices
{
/// 動画キャプチャ用のバッファを割り当てることが可能
void Initialize();
/// キャプチャ動画とオーディオをムービーファイルとして出力することが可能
void Finalize();
/// ファイルに、単一の動画フレームバッファをキャプチャする可能性。
void CaptureSingleFrame();
}
/// ゲームコードでアクセスできるオーディオキャプチャサービス
namespace AudioCaptureServices
{
/// 以後のオーディオサンプルのキャプチャのために、バッファを割り当てたり、ファイルを開いたりする。
void Initialize(unsigned in_uSampleRate, unsigned in_uChannels);
/// オーディオサンプルキャプチャが完了したら、バッファやファイルハンドルを解放する。
void Finalize();
/// 割り当てられたバッファに、オーディオサンプルを追加する
void CaptureInterleavedSamples(float* in_pfSamples, unsigned in_uSampleCount);
}
class GameInterface
{
// ...
public:
/// Function called once per game frame
virtual void UpdateCallback(float deltaTime //< elapsed wall clock time in real-time, inverse of the desired frame rate in offline mode
) = 0;
};
class Game : public GameInterface
{
// ...
private:
/// オフラインレンダリングが有効なときはTrue。
bool m_bIsOfflineRendering{ false };
/// キャプチャコールバックの登録・登録解除のための、出力デバイスID。
AkOutputDeviceID m_defaultOutputDeviceId{ AK_INVALID_OUTPUT_DEVICE_ID };
/// Wwiseオーディオキャプチャのコールバック。
static void CaptureCallback(AkAudioBuffer& in_CaptureBuffer, AkOutputDeviceID /*in_idOutput*/, void* /*in_pCookie*/)
{
const unsigned uSampleCount = static_cast<unsigned>(in_CaptureBuffer.uValidFrames) * in_CaptureBuffer.NumChannels();
if (!uSampleCount)
return;
AudioCaptureServices::CaptureInterleavedSamples(in_CaptureBuffer.GetInterleavedData(), uSampleCount);
}
public:
/// オフラインレンダリングの有効化・無効化のためにコールする関数
void SetOfflineRendering(bool bIsOfflineRendering //< オフラインレンダリングはtrue、リアルタイムレンダリングはfalse
)
{
const bool bWasOfflineRendering{ m_bIsOfflineRendering };
m_bIsOfflineRendering = bIsOfflineRendering;
// オフラインレンダリングの有効化・無効化のために、メッセージをメッセージキューにポストする
AK::SoundEngine::SetOfflineRendering(m_bIsOfflineRendering);
if (m_bIsOfflineRendering == bWasOfflineRendering)
return;
// 後続のRenderAudio()へのコールでオーディオサンプルがさらに生成されないように、オフラインレンダリングのフレームタイムをゼロに設定するメッセージをメッセージキューにポストする。
// RenderAudio()をコールしてメッセージキューをフラッシュする。このコール後にオフラインレンダリングが有効化・無効化される。
if (m_bIsOfflineRendering)
{
VideoCaptureServices::Initialize();
// 登録解除のために、出力デバイスIDをキャッシュする。
m_defaultOutputDeviceId = AK::SoundEngine::GetOutputID(AK_INVALID_UNIQUE_ID, 0);
AkChannelConfig channelConfig{};
Ak3DAudioSinkCapabilities audioSinkCapabilities{};
// チャンネル数を取得する。
AK::SoundEngine::GetOutputDeviceConfiguration(m_defaultOutputDeviceId, channelConfig, audioSinkCapabilities);
const AkUInt32 uSampleRate{ AK::SoundEngine::GetSampleRate() };
// 適切なバッファを割り当てるために、サンプルレートとチャンネル数を提供。
AudioCaptureServices::Initialize(uSampleRate, channelConfig.uNumChannels);
AK::SoundEngine::RegisterCaptureCallback(&CaptureCallback, m_defaultOutputDeviceId, this);
}
else
{
AK::SoundEngine::UnregisterCaptureCallback(&CaptureCallback, m_defaultOutputDeviceId, this);
AudioCaptureServices::Finalize();
VideoCaptureServices::Finalize();
}
}
void UpdateCallback(float deltaTime) override
{
if (m_bIsOfflineRendering)
if (m_bIsOfflineRendering)
VideoCaptureServices::CaptureSingleFrame();
}
};
AKSOUNDENGINE_API AkUInt32 GetSampleRate()
AkForceInline AkUInt32 NumChannels() const
Get the number of channels.
Definition: AkCommonDefs.h:491
AKSOUNDENGINE_API AKRESULT SetOfflineRenderingFrameTime(AkReal32 in_fFrameTimeInSeconds)
AkUInt16 uValidFrames
Number of valid sample frames in the audio buffer
Definition: AkCommonDefs.h:656
AKSOUNDENGINE_API AkOutputDeviceID GetOutputID(AkUniqueID in_idShareset, AkUInt32 in_idDevice)
AKSOUNDENGINE_API AKRESULT GetOutputDeviceConfiguration(AkOutputDeviceID in_idOutput, AkChannelConfig &io_channelConfig, Ak3DAudioSinkCapabilities &io_capabilities)
AKSOUNDENGINE_API AKRESULT RegisterCaptureCallback(AkCaptureCallbackFunc in_pfnCallback, AkOutputDeviceID in_idOutput=AK_INVALID_OUTPUT_DEVICE_ID, void *in_pCookie=NULL)
AKSOUNDENGINE_API AKRESULT RenderAudio(bool in_bAllowSyncRender=true)
AKSOUNDENGINE_API AKRESULT UnregisterCaptureCallback(AkCaptureCallbackFunc in_pfnCallback, AkOutputDeviceID in_idOutput=AK_INVALID_OUTPUT_DEVICE_ID, void *in_pCookie=NULL)
static const AkUInt32 AK_INVALID_OUTPUT_DEVICE_ID
Invalid Device ID
Definition: AkTypes.h:189
static const AkUniqueID AK_INVALID_UNIQUE_ID
Invalid unique 32-bit ID
Definition: AkTypes.h:177
AKSOUNDENGINE_API AKRESULT SetOfflineRendering(bool in_bEnableOfflineRendering)
uint32_t AkUInt32
Unsigned 32-bit integer
AkUInt64 AkOutputDeviceID
Audio Output device ID
Definition: AkTypes.h:167
AkForceInline void * GetInterleavedData()
Definition: AkCommonDefs.h:513

このページはお役に立ちましたか?

サポートは必要ですか?

ご質問や問題、ご不明点はございますか?お気軽にお問い合わせください。

サポートページをご確認ください

あなたのプロジェクトについて教えてください。ご不明な点はありませんか。

プロジェクトを登録していただくことで、ご利用開始のサポートをいたします。

Wwiseからはじめよう