最近在研究Windows的空间音效,想在Windows上用Dolby Access正确映射eac3-joc音频,但是看了一下,Windows文档里面写了要实现空间音频,需要使用ISpatialAudioClient这个API。这个API需要应用传入每个物件的元数据和音频流,Windows负责合成。但是Dolby Atmos是闭源的商业音频格式,开源的方案只能提取出床声道,无法解码物件元数据,所以这个API就用不了了。
然后我想,也不可能用WASAPI或者directx输出,这些只能传PCM,传不了已编码的音频流。Apple Music和Windows自带的media player是可以正确调用Dolby Access的,所以一定有什么办法可以调用。
经过我和ChatGPT长达5分钟的讨论,找到了一个正确的实现方式,大概就是Apple Music和Windows自带的media player的实现方式:Media Foundation。一个Windows内置的媒体渲染路径,只要直接把eac3-joc的音频流给到他,Windows就会自己处理,走系统的解码器(MFT)与 spatial 管线;如果系统上有 Dolby 的渲染器(Dolby Access 已启用“Dolby Atmos for Headphones”),最终输出将由它处理并生成两声道 binaural PCM。
目前绝大部分的播放器都走的不是Media Foundation架构,VLC,基于Directshow的mpc-be等,都没有把音频解码交给系统去处理,而是自己解码之后输出PCM给系统或者不解码音频直通给外部解码器,导致Dolby Access只能接收到PCM,再通过算法还原出空间信息,映射到双耳。
接下来讲一下我自己对Windows的空间音效的理解吧:
首先在一般情况下,应用通过共享的WASAPI或者DirectX输出PCM音频,这时候空间音效会按照标准的多声道PCM的摆放位置渲染出双耳的音频,输出到设备,根据空间音效的不同,还可能利用算法计算出声音的位置,再渲染输出。
如果应用使用的是ISpatialAudioClient,如游戏等实时生成的音频,应用会把音频物件元数据和他们的PCM流给到ISpatialAudioClient,由空间音效处理这些音频物件再空间中的位置,渲染到双耳,再由系统输出到设备。
至于上面讲的Media Foundation,如果接收到的是空间音频,则会直接给到空间音效去解码处理,渲染到双耳并输出。
如果应用是WASAPI独占模式/SPDIF输出,空间音效就可能会导致输出有问题。
另外,Media Foundation也是会音频直通的,如果输出的设备EDID宣告支持DD+/TrueHD/DTS:X,而且启用了对应的空间音效,Media Foundation就会将音频流以独占直通的方式发送到输出设备。
补充一下Dolby Access的本质,一个软件杜比MAT编码器授权,加上一个软件杜比渲染器,再加上加上杜比音效。Windows里面的杜比MAT编码器用于接收ISpatialAudioClient传入的原始空间音频,渲染出空间音频LPCM+MAT的专有格式。杜比渲染器用于将eac3-joc的音频或者上面传入的渲染为2ch PCM,根据输出设备和授权决定渲染的参数,比如笔记本内置的杜比全景声就会根据厂商的调教渲染,耳机就会根据预设的方式渲染。至于杜比音效就很简单了,就是一个预设的EQ,只负责调整最终的音频风格。还有里面Dolby Vision,这个就是一个dv解码器的调整,Media Foundation和dv解码器才是负责把杜比视界视频解码输出给屏幕的。
發佈留言
很抱歉,必須登入網站才能發佈留言。