问题复现

之前一直使用耳机的时候音频输出都没有问题,直到有一次想玩 PS4,把耳机拔下来之后出现了这个问题。反复试验,在 Audio Source 正常播放的时候改变系统的默认输出就会引发这个问题。

现状与理想状态

现状是更改了系统默认输出后,当前 Audio Source 会被重置。

理想状态是更改了系统默认输出后,Audio Source 重新选择输出接口,然后继续在新的输出接口播放音频。

解决方案

随意去谷歌百度搜了一下,没有搜到相关的解决方法,只有自己研究了。一开始我以为整个 Audio Source 都被初始化了,后来测试发现其实在发现系统音频接口变化后 Unity 会自动对当前 Audio Source 做一个 Reset 操作,这个 Reset 操作不会改变当前 Audio Source 的 Audio Clip,只会将 Time 清零。

所以解决方法也很好想了,我们如果可以拦截到系统默认音频输出的事件,就可以在之后重新输出。查询 Unity Script API 可以知道其实 Unity 是提供一个相关事件的。

最后我们要在 Update 里面每帧记录一个当前播放时间点,然后在恢复播放之前恢复播放进度就可了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Sound currentSound = null;
private float timeCounter;

void OnAudioConfigurationChanged(bool deviceWasChanged)
{
    currentSound.source.time = timeCounter;
    currentSound.source.Play();
}

private void Update()
{
    if (currentSound != null)
        timeCounter = currentSound.source.time;
}


发现存在错别字或者事实错误?请麻烦您点击 这里 汇报。谢谢您!