版本
menu_open
警告:系统已根据您所用大版本 (2023.1.6.8555) 自动跳转至最新文档。若想访问特定版本的文档,请从 Audiokinetic Launcher 下载离线文档,并在 Wwise 设计程序中勾选 Offline Documentation 选项。
Wwise SDK 2023.1.6
利用 Wwise 进行离线渲染

离线渲染

Wwise 声音引擎提供离线渲染功能以便实现计算量大的非实时音频生成以及音频处理和计算量大的视频生成之间的同步。

注意: 在使用同步 AK::SoundEngine::LoadBankAK::SoundEngine::UnloadBank API 的应用中启用离线渲染时须格外小心。有关详细信息,请参阅 音频渲染线程 章节。

可使用 AK::SoundEngine::RegisterCaptureCallback 来注册音频捕获回调,以便借助相应机制来访问经过渲染的音频缓冲区。

下面举例阐释了如何实现离线渲染:

/// 可在游戏代码中访问视频捕获服务
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:
/// 每一游戏帧调用一次函数
virtual void UpdateCallback(float deltaTime //< 经过的实时时钟时间,与离线模式下所需的帧率相对
) = 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();
// When engaging offline rendering, the output configuration will switch to Stereo output by default
// In order to render to a different output speaker layout, replace the output with an explicitly defined one.
// In this example, switch to 7.1.4
AkChannelConfig surroundConfig;
// Post a mesage to replace the output device.
AkOutputSettings newSettings;
newSettings.audioDeviceShareset = AK::AUDIO_DEVICES::SYSTEM;
newSettings.idDevice = 0;
newSettings.channelConfig = surroundConfig;
AK::SoundEngine::ReplaceOutput(newSettings, 0, &m_defaultOutputDeviceId);
// Flush the message queue again to make sure ReplaceOutput is processed, before registering the capture callback on the offline device
const AkUInt32 uSampleRate{ AK::SoundEngine::GetSampleRate() };
// 提供采样率和声道数以便分配相应的缓冲区。
AudioCaptureServices::Initialize(uSampleRate, surroundConfig.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()
AkPanningRule ePanningRule
AkUInt32 uNumChannels
Number of channels.
AkForceInline AkUInt32 NumChannels() const
Get the number of channels.
Definition: AkCommonDefs.h:492
Platform-independent initialization settings of output devices.
AKSOUNDENGINE_API AKRESULT SetOfflineRenderingFrameTime(AkReal32 in_fFrameTimeInSeconds)
AKSOUNDENGINE_API AKRESULT ReplaceOutput(const AkOutputSettings &in_Settings, AkOutputDeviceID in_outputDeviceId, AkOutputDeviceID *out_pOutputDeviceId=NULL)
AkUInt16 uValidFrames
Number of valid sample frames in the audio buffer
Definition: AkCommonDefs.h:657
#define AK_SPEAKER_SETUP_DOLBY_7_1_4
Dolby 7.1.4 setup channel mask
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:107
@ AkPanningRule_Speakers
Left and right positioned 60 degrees apart (by default - see AK::SoundEngine::GetSpeakerAngles()).
Definition: AkTypes.h:1128
AKSOUNDENGINE_API AKRESULT SetOfflineRendering(bool in_bEnableOfflineRendering)
AkForceInline void SetStandard(AkUInt32 in_uChannelMask)
Set channel config as a standard configuration specified with given channel mask.
AkUniqueID audioDeviceShareset
uint32_t AkUInt32
Unsigned 32-bit integer
AkChannelConfig channelConfig
AkUInt64 AkOutputDeviceID
Audio Output device ID
Definition: AkTypes.h:85
AkForceInline void * GetInterleavedData()
Definition: AkCommonDefs.h:514

此页面对您是否有帮助?

需要技术支持?

仍有疑问?或者问题?需要更多信息?欢迎联系我们,我们可以提供帮助!

查看我们的“技术支持”页面

介绍一下自己的项目。我们会竭力为您提供帮助。

来注册自己的项目,我们帮您快速入门,不带任何附加条件!

开始 Wwise 之旅