CRIWARE Unity Plugin Manual  Last Updated: 2024-07-12
声音回放的估计延迟时间
注意
  • 启用 SonicSYNC 时,无法使用此功能。
  • 建议使用SonicSYNC以减低延迟。

声音回放的估计延迟时间

声音回放的估计延迟时间

在本部分中,声音回放的延迟时间指的是当程序引发回放和设备音响真正播放音频的时间差。
atom_about_start_latency.png
声音回放延迟的定义
在安卓设备中,声音回放延迟时间基本上都比较长,不同设备的延迟时间也可能差异较大。

声音回放延迟引发的问题

举例,如果在节奏游戏中场景必须根据音乐而转变,那么声音回放延迟将会引发问题。
如果声音回放延迟时间较长,哪怕程序根据音乐回放的时间点而转换场景,音乐和场景也将无法同步。
当声音回放延迟时间可根据设备型号而产生很大的差异时,用户将很难在程序中调整时间点。
用户会在某些时候因动作的时间滞后而感觉不愉快,比如敲击按键和播放相应声音的时间间隔。
该问题同样由声音回放延迟引起,并无法估计延迟时间来解决该问题。
如需了解该问题在ADX中的解决方案,请查看 " 安卓的低延迟声音回放 "。

ADX的声音回放延迟的估计时间

ADX提供了"声音回放的估计延迟时间"功能,以简化应用程序需为各个设备分别调整时间点的工作。
该功能的理念为,如果程序能够动态获取一个设备的声音回放延迟时间,那么程序就无需为每个设备记录各个延迟时间。
然而,ADX的"声音回放的估计延迟时间"并不确保能给出完全正确的结果。根据不同设备,它有可能给出一个与实际延迟时间非常不同的结果。
请注意我们假设应用程序为每个设备调整设定时,仅将该功能用于参考。
然而,请注意不使用麦克风。

版本不同的结果差异

从SDK 3.08.00开始,使用本功能所获取的值趋于变小。
这是由于支持 SonicSYNC 后,
传统非SonicSYNC中的部分播放处理和修改了延迟推测功能的执行规范而导致的变化。

使用"声音回放的估计延迟时间"

默认设定下,"声音回放的估计延迟时间"功能是被关闭的。
如需开启该功能,它必须在Unity Editor中配置,以及需从脚本中调用函数。请跟随以下步骤:
  1. 使用 CriWare.CriWareInitializer 组件来初始化CRI Atom文件库。
  2. 从脚本中调用 CriWare.CriAtomExLatencyEstimator.InitializeModule 函数以开始配置估计延迟时间.
  3. 对于非同步执行的估计延迟时间配置,请使用 CriWare.CriAtomExLatencyEstimator.GetCurrentInfo 来确认运行状态以及延迟估计值。
  4. 如果状态显示 "Completed"(完成),请在应用程序代码中记录延迟估计值(毫秒)。
  5. 调用 CriWare.CriAtomExLatencyEstimator.FinalizeModule 函数以完成配置估计延迟时间。
配置延迟的估计时间可能需要花上数秒。
如需了解以上步骤的实例,请查看 [CriAtom] 估算Android设备的声音播放的延迟时间

在程序中使用估计结果

计算一个音频已播放的时长

ADX的playback time acquisition(获取回放时间)功能并不考虑延迟时间。
应用程序需考虑到延迟时间来计算出正确的时间。
当场景需根据音乐而转换时,可以用以下方法来计算音频已播放的时长。

atom_howto_use_latency.png
计算音频已播放时长的公式(例子)
举例,如果延迟时间为200毫秒,音频需从-200毫秒开始。
当从ADX获取回放时间时,将该时间从延迟时间减200毫秒以获得真正的播放时间。
请将该公式用于参考来调整程序中的场景转换。
然而,ADX的估计延迟时间并不完美。在音乐游戏中,最理想的是玩家能够对时间点进行微调。
在这种情况下,估计延迟时间可以用作初次启动应用程序的默认值,随后再以此进行调整。

在什么时候需要估计延迟时间?

延迟估计时间在每次启动应用程序时都有可能不同。
因此,如果每次启动时程序都估计延迟时间,用户可能感到困惑。所以当程序保存延迟值后,不再每次自动重新计算延迟值是一个好主意。

在什么时候估计延迟时间不好用?

在某些情况下,ADX的估计延迟时间有可能和实际延迟时间非常不同。
已知以下问题:
  • 当使用无线耳机时,实际延迟时间有可能比估计延迟时间要长。
  • 如果设备的声音选项提供了特殊的音效时,实际延迟时间有可能比估计延迟时间要长。
请注意,当下并没有任何方案来解决这些问题。

延迟推测失败的原因

CriWare.CriAtomExLatencyEstimator.GetCurrentInfo 函数获取的执行状态可能因为以下原因迁移到“Error”。
  • 由于操作系统的原因声音无法回放。
  • 延迟过大导致处理超时。
    请预先做延迟推测有可能失败的准备,采取诸如“请求重启应用程序”、“使用预先准备的默认值”等措施。

    如果延迟推测失败并发生错误“E2015062623:failed to realize OpenSLES player.”,其可能原因是由于低延迟回放的使用,OpenSLES的Player生成数已达到了操作系统所设置的上限。<BR> 请尝试调低 CRIWARE Library Initializer 组件中设置的低延迟回放用Voice Pool的大小来解决问题。