我目前正在尝试在处理 HLS 和原始 MP4 文件的视频播放器上集成自定义音频过滤器。我在 Chrome 和 Firefox 上集成它几乎没有问题 - 另一方面,Safari 没有相应的行为。我偶然发现safari 从通话中路由音频的方式不一致。createMediaElementSource
我创建了一个小演示来说明问题(Safari ONLY for native HLS support),我明确省略了任何音频过滤器代码,因为它与主要问题几乎没有相关性:
https://codepen.io/edvincandonus/pen/ZEGVbPG
在演示中,一旦通过用户手势实例化并“解锁”了 audioContext ,我通过创建 MediaElementAudioSourceNodeaudioCtx.createMediaElementSource(video)
并将其悬空(如未连接)。因此,HTMLMediaElement 将被重新路由到 AudioContext 的处理图中,并且由于没有与 建立连接,因此audioCtx.destination
在视频播放开始时应该会丢失音频播放。
这是 Firefox 上的行为。如果 MediaElementAudioSourceNode 没有最终目标节点,Chrome 会更进一步并阻止视频播放(尝试在 chrome 上播放演示中的 MP4)
至于 Safari:只有当视频源是原始 MP4 文件时才会满足这种期望 - 但是当切换到m3u8/hls 流时,HTMLMediaElement 的音频没有正确路由到 AudioContext,因为您可以清楚地听到视频的声音。
这是一个已知的野生动物园限制吗?如果没有,是否有任何解决方法可以使用 Safari 对该协议的本机支持从 HLS 流中正确访问和路由音频?
我偶然发现了旧的 stackoverflow 答案,表明 createMediaElementSource 在 Safari 上一直存在问题,但我认为他们现在应该已经修复了。