先决条件
本演练假定你对 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 毫秒的音频。为了防止音频卡顿,应以恒定速率提交音频。
