Skip to main content
PlayFab Party 是一款实时联网和语音聊天解决方案。配置为语音聊天时,PlayFab Party 会传输麦克风音频并原样播放。有些游戏需要访问语音聊天音频缓冲区来实现自定义音频效果,如空间音频或语音过滤器。本文档提供了如何使用实时音频操作功能在 PlayFab Party 中截获和修改语音聊天音频的演练。

先决条件

本演练假定你对 PlayFab Party 中的语音聊天有基本了解。

平台支持

并非所有平台都可以使用实时音频操作。虽然与实时音频操作相关的方法存在于统一的跨平台标头中,但它们目前仅针对 Windows、XBOX 和 PlayStation® 5 实现。这些方法在其他平台上将返回错误。

音频流

实时音频操作引入了音频流的概念,用于从库中检索音频或将音频提交到库中。有两种类型的音频流。第一种是源流。源流用于从聊天控件检索音频。每个聊天控件只能有一个源流,称为语音流。对于本地聊天控件,这用于检索麦克风输入;对于远程聊天控件,这用于检索传入的语音音频。如果聊天控件存在语音流,则库将把该聊天控件的源音频重定向到其语音流,而不是自动处理音频。对于本地聊天控件,这意味着将麦克风音频重定向到语音流,而不是自动编码并传输它;对于远程聊天控件,这意味着将传入的语音音频重定向到语音流,而不是自动将其提交到每个本地聊天控件进行播放。源流由 PartyAudioManipulationSourceStream 表示。 第二种类型的流是接收流。接收流用于向聊天控件提交音频。只有本地聊天控件可以拥有接收流,每个可以有两个。它们分别称为捕获流渲染流。如果聊天控件存在捕获流,则库将从捕获流拉取音频进行编码并传输到其他聊天控件,而不是麦克风。如果聊天控件存在渲染流,则库将从渲染流拉取音频并播放,除了自动从远程聊天控件播放的语音聊天音频以外。提交到捕获流的音频用作本地聊天控件的麦克风输入;提交到渲染流的音频将播放或“渲染”到本地聊天控件的音频输出设备。接收流由 PartyAudioManipulationSinkStream 表示。

配置音频流

默认情况下,库处理音频检索、传输和播放。因此,创建聊天控件时不带任何音频流。你可以通过流配置方法为聊天控件创建一个或多个流——PartyLocalChatControl::ConfigureAudioManipulationCaptureStream()PartyLocalChatControl::ConfigureAudioManipulationRenderStream()PartyChatControl::ConfigureAudioManipulationVoiceStream()。配置后,可以通过 PartyLocalChatControl::GetAudioManipulationCaptureStream()PartyLocalChatControl::GetAudioManipulationRenderStream()PartyChatControl::GetAudioManipulationVoiceStream() 检索流 每个流配置方法允许你指定将从流中检索或提交到流的音频格式。有关支持的格式的更多信息,请参见每种流配置方法的参考文档。

从源流中检索音频

你可以通过 PartyAudioManipulationSourceStream::GetNextBuffer() 从源流中检索音频。检测到语音活动后,大约每 40 毫秒会有新缓冲区可用。如果没有可用缓冲区,则调用将成功并提供长度为零的缓冲区。可以通过 PartyAudioManipulationSourceStream::GetAvailableBufferCount() 检索瞬时可用的缓冲区总数。 为了效率,GetNextBuffer() 提供一个指向库内存的缓冲区,而不是复制整个缓冲区。可以选择就地修改它。处理完缓冲区后,应通过 PartyAudioManipulationSourceStream::ReturnBuffer() 释放它,以便库可以回收其内存。可以在归还任何缓冲区之前检索多个缓冲区,并且缓冲区不必按其被检索的顺序归还。

向接收流提交音频

你可以通过 PartyAudioManipulationSinkStream::SubmitBuffer() 向接收流提交音频。缓冲区由库复制,可以在调用完成后立即释放。 每 40 毫秒,库会消费已提交到接收流的 40 毫秒的音频。为了防止音频卡顿,应以恒定速率提交音频。

场景

麦克风音频操作,又名预编码缓冲区操作

麦克风音频操作是在将麦克风音频传输到其他聊天控件之前截获并更改它的行为。这有时被称为“预编码缓冲区操作”,因为麦克风音频在被编码并传输到其他聊天控件之前被修改。如果你希望为本地聊天控件实现此场景,请首先为本地聊天控件配置语音流和捕获流。配置后,专用音频线程的每次滴答所调用的处理该单个聊天控件的麦克风音频的函数可能类似于下面所示。

远程音频操作,又名解码后缓冲区操作

远程音频操作是在将传入音频渲染到每个本地聊天控件之前截获并更改它的行为。这有时被称为“解码后缓冲区操作”,因为传入音频在解码后但渲染前被修改。如果你希望实现此场景,请先为每个远程聊天控件配置语音流,并为每个本地聊天控件配置渲染流。然后,音频线程的每次滴答都应从每个语音流中拉取音频,将音频混合成单个流,同时选择性地应用效果,并将混合后的缓冲区提交到每个渲染流。根据你的游戏场景,你可能需要将缓冲区混合成每个本地聊天控件的不同流。专用音频线程的每次滴答所调用的处理传入语音音频的函数可能类似于下面所示。

隐私和混合考虑事项

只要远程聊天控件正在生成音频,并且聊天权限静音配置允许音频至少由一个本地聊天控件播放,则库将通过远程聊天控件的语音流提供音频。如果音频应向某个本地聊天控件播放而不向另一个播放,则必须将其从后者聊天控件的音频混合中排除。

聊天指示器注意事项

为远程聊天控件配置语音流不会影响其聊天指示器。你可能需要实现逻辑来协调聊天指示器与你的混合逻辑之间的差异,以选择正确的 UI 指示器。例如,聊天指示器可能表示聊天控件正在说话,但自定义混合逻辑可能选择丢弃该音频。

混合场景

在某些场景中,你可能希望为某些聊天控件启用音频操作,而不对其他聊天控件启用。例如,你可能希望对游戏比赛中遇到的对手玩家应用效果,但不对同一团队的玩家应用效果。在这种情况下,你可以按照之前概述的远程音频操作步骤操作,同时仅为你希望应用音频效果的聊天控件配置语音流。只要静音和权限配置允许,其余远程聊天控件的音频将自动渲染到本地聊天控件。
最后修改于 2026年8月24日