跳到主要内容

流式音波

关于语音活动检测(VAD),请参阅此页面

流式音波是一种支持动态添加音频数据的导入音波类型,即使在播放过程中也可以添加。它提供与导入音波相同的功能,例如倒带,并可用于SoundCue等场景。

创建流式音波

首先您需要创建一个流式音波。请注意,您应该将其视为强引用以防止过早销毁(例如通过在蓝图中将其分配给单独的变量或在C++中使用UPROPERTY())。

创建流式音波节点

播放声波

之后你可以回放这个声波。不过现在并不需要立即播放,你可以稍后再开始播放声波。

播放声波的各种示例

预分配音频数据

可选地,你可以预分配音频数据(字节)以避免每次追加新音频数据时重新分配整个PCM缓冲区。

预分配音频数据节点

追加音频数据

要向现有缓冲区的末尾添加音频数据,请使用相应的函数来动态追加音频数据。播放将遵循这些追加操作的队列顺序。

追加音频数据节点

避免加速或失真的音频播放

当在声波播放过程中同时流式传输音频数据时,在特定场景下您可能会遇到音频加速或失真的问题。这种情况通常发生在:

  1. 声波播放接近/到达当前缓冲区末尾时
  2. 新的音频数据正被持续加入流式声波队列
  3. 播放进度赶上了传入的数据流

您可以随时停止填充音频数据而不会出现问题。但对于需要持续流式传输的场景(如实时音频流),根据音频数据流的可靠性有两种处理方式:

对于可靠、稳定的流传输: 使用 OnPopulateAudioState 委托在接收到第一个数据块后立即开始播放。

对于不可靠的流传输(网络问题、间歇性数据): 即使在 OnPopulateAudioState 触发后,也额外添加延迟以在开始播放前建立更大的缓冲区。

使用 OnPopulateAudioState 避免播放问题

注意: 您可以随时停止填充音频数据而不会导致播放问题。具体方法取决于您的音频数据流可靠性——对于稳定的数据流使用即时播放,或为不可靠的数据流(例如网络连接问题)添加额外的缓冲延迟。

使用示例

最终,您的实现可能如下所示:

使用流式音波的示例

填充音频状态时

OnPopulateAudioState 委托的功能类似于 OnPopulateAudioData,但不会广播已填充的音频数据。当您希望跟踪音频数据填充时间而不传递已填充音频数据数组时(这可以提高性能),此功能会非常有用。

On Populate Audio State delegate

处理PCM数据

如需在播放期间实时访问PCM数据,请参阅PCM数据处理