Opus 硬件解码版本特性
以往在 XBOX One 家族主机上,XMA 是唯一提供硬件卸载解码的方案。现在,在 XBOX Series X|S 世代主机上,我们通过 XAPU (XBOX Audio Processing Unit) API 引入了 Opus 硬件卸载解码。 Opus 是一种免版权的音频压缩编解码器,旨在将语音和通用音频高效地编码到单一格式。Opus 具有低延迟。内部评测显示,Opus 在音质和文件大小压缩比方面均超越 XMA。 此外,还新增了高质量采样率转换器 (HSRC),可配合硬件解码功能 (Opus) 工作。当将 Opus 硬件卸载解码与 HSRC 功能结合以进行音高变换时,开发者会发现输出质量优于上一代的 SHAPE 方案(在 XBOX Series X|S 主机上仍为向后兼容而保留)。本版本新增
- June FAL QFE3 新增:在 Quick Resume 场景下,恢复后不再要求游戏重新建立与硬件的连接。
- June FAL QFE4 新增:CELT 现在支持 2.5 ms 和 5 ms 长度的 Opus 数据包。
- August 2020 Preview Recovery 版本 10.0.19041.4124 (rs_xbox_release_2008-19041.4124.200814-0000) / 10.0.19041.3562 (rs_xbox_release_sirius-19041.3562.200814-2300) 或更高版本:XApuDecodeConvertCommand 实现的破坏性变更:使用 firstFrameIndex 时,残余数据 (residual data) 现在不再被包含(此前是包含的)。更多细节请参见”最佳实践”一节或 API 参考页 XApuDecodeConvertCommand。
- 如果 HSRC 输出处理缓冲区中还有数据,此前一旦使用 flush 命令就会造成数据丢失(可能丢失部分已转换的音频数据,输出也不符合预期)。
- 如果提交了不受支持的 Opus 数据包,现在会抛出错误,而不是导致挂起(例如仅支持 10 ms 或 20 ms 时提交了 2.5 ms 的 Opus 数据包)。
- FIFO 默认开启。
- 整体性能改进和稳定性修复。
Opus 硬件解码版本规格
下表列出了可用的命令和特性:关于 HSRC 使用的重要说明
高质量采样率转换器 (HSRC) 具有依赖于频率的群延迟,对于低于 10 kHz 的频率大约为 5 帧。 启用采样率转换器时,预期输出延迟为 5 帧,调用方可以相应调整。如果你使用的是音频中间件方案,这一延迟对你的游戏来说可能已经被处理。最佳实践
- 关于 XApuDecodeConvertCommand 的实现:传入的 firstFrameIndex 指定将被复制到 PCM 输出缓冲区的第一个帧。firstFrameIndex 与 frameCount 一起决定被复制到输出缓冲区的内容。我们的实现在使用 firstFrameIndex 时不包含残余数据。如果残余数据有 100 帧,firstFrameIndex 设置为 50,frameCount 设置为 200,则会在完整的残余数据之后再从解码数据的第 50 帧开始添加 200 帧。这意味着进入 HSRC 的缓冲区将由原始的 100 帧残余数据加上当前解码数据包中从第 50 帧开始的 200 帧组成。
- 建议谨慎创建 XAPU 客户端。最好在前期(音频引擎资源激活时)就创建好 XAPU 客户端,并在整个游戏生命周期内持续使用。XApuConnect 和 XAapuDisconnect 调用计算开销较大。如果频繁创建和销毁具有不同内存需求的客户端,你可能会面临资源耗尽的风险。
- 对于循环场景,是否使用 XApuCommandType::Reset 由调用方自行决定,因为它可能在输出中造成瞬态效应。但一旦使用了 XApuCommandType::Reset,必须提交预滚 (pre-roll) 数据包以避免瞬态效应。
- 为获得最佳性能,请使用以 20 ms 数据包大小编码的 Opus 流。
- 从性能角度看,使用较少的客户端和较多的流可能优于较多的客户端和较少的流。例如,5 个客户端每个 20 条流,总计 100 条流,比 50 个客户端每个 2 条流性能更好。两者都能解码 100 条流,但前者性能更佳。
- 支持 OPUS_SET_PREDICTION_DISABLED,可禁用数据包间预测。使用该标志编码会降低压缩性能,从而降低解码输出的质量。
- 当硬件设备处于异常状态时,XAPU 会返回 XAPU_E_DEVICE_FATAL 错误。此时应先断开所有 XAPU 客户端,再创建任何新客户端以从该错误中恢复。
- 命令完成的信号机制基于 3 ms 的定时器,且对每个 XAPU 客户端只发出一次信号,涵盖迄今为止已完成的所有命令,无论有多少命令使用了 XApuCommandOptions::SignalOnCompletion 标志。
- 如果游戏无法容忍 3 ms 的信号机制,可以在循环中查找响应,或使用 Sleep(0) 并检查响应。
- 在断开客户端之前等待所有响应非常重要。如果仍有未领取的请求,XApuDisconnect 现在会返回 XAPU_E_PENDING_RESULTS 错误。该错误无法直接处理,仅供开发期使用。XApuDisconnect 会释放为该客户端分配的所有资源,如果在硬件仍在为该客户端处理命令时调用它,硬件可能向已被释放的内存写入,从而导致内存损坏。
- 传给硬件的所有内存指针(例如 inputData、outputData 和 processingBuffer)都应按 16 字节对齐。
- 使用 ConvertOnly 或 DecodeConvert 模式时,更大的输出帧数会带来更好的性能。decode convert 与 convert 支持的最大输出帧数为 1024。
- 仅支持可变比特率 (VBR) 编码。不支持恒定比特率 (CBR) 编码,因为 CBR 会加入过渡包 (transition packets),其效率和质量都不如 VBR 编码中的冗余包 (redundancy packets)。因此,这种数据包类型(也就是 CBR)不受支持。
- 对于 HYBRID 和 SILK:仅支持单声道或立体声 Opus 流,数据包为 10 或 20 ms,采样率为 48000 Hz。
- 对于 CELT:仅支持单声道或立体声 Opus 流,数据包为 2.5、5、10 或 20 ms,采样率为 48000 Hz。
游戏的暂停与恢复
游戏必须能够暂停和恢复,例如当用户将其切换到 Constrained 模式时。挂起处理器被调用时,只需停止向硬件提交 XAPU 命令即可。已经提交的命令会正常完成,并放入其对应的响应队列中。示例(源代码位于外部 .zip 文件中,可发送邮件至 AnaAud@microsoft.com 索取)
- Decode One Opus Stream。(本示例概述见 此处。)
- Decode Multi-Opus Streams。
- Play One Opus Stream。(线程模型与 “Decode One Opus Stream” 不同。)
- Play Multi-Opus Streams。
- Decode Convert One Opus Stream,附带循环和采样级精确定位选项。
- Decode Convert Multi-Opus Streams。
- Play Decode Convert One Opus Stream。
- SimpleXAPU(在带 UI 的 GDK 游戏中进行 Opus 流解码的示例。)
联系
如果你对该功能有任何问题或疑问,请发送邮件至 AnaAud@microsoft.com 或使用在线论坛。参考 API 文档
- Xapu (API 内容)
- Functions
- Structures
