Реализация AudioWorklet в Safari
Я изучал некоторые примеры, перечисленные здесь: Google Chrome Labs — AudioWorklet . Они помогли мне пройти большую часть пути к реализации моего собственного AudioWorklet на основе WASM. Вскоре я заметил, что Safari не поддерживаетWorklet.addModule()
? Я не могу найти альтернативные способы в Интернете, которые демонстрируют, как реализовать AudioWorklet безaddModule
, может ли кто-нибудь помочь мне понять, можно ли использовать AudioWorklet в Safari без этого метода?
2 ответа
Я обнаружил, что в Chrome вам необходимо:
// wait for user interaction
const context = new AudioContext()
await context.audioWorklet.addModule('./worklet.js')
const worklet = new AudioWorkletNode(context, 'workletName')
worklet.connect(context.destination)
Однако в Safari, если я включу «Консоль> Ведение журнала мультимедиа», я вижу, что это не работает с
BaseAudioContext::willBeginPlayback возвращает false, не обрабатывает жесты пользователя и не захватывает
Это, по-видимому, связано сawait
между взаимодействием с пользователем иnew AudioWorkletNode
.
Если я изменю порядок в Safari на:
const context = new AudioContext()
await context.audioWorklet.addModule('./worklet.js')
// wait for user interaction
const worklet = new AudioWorkletNode(context, 'workletName')
worklet.connect(context.destination)
Это работает, но теперь не работает в Chrome (!), Который теперь выдает ошибку:
AudioContext не удалось запустить. Он должен быть возобновлен (или создан) после жеста пользователя на странице.
Возможно, включите «Консоль > Ведение журнала мультимедиа» в инструментах разработчика Safari и посмотрите, возникает ли та же проблема, что и у вас?
Чтобы заставить его работать как в Safari, так и в Chrome, вы можете создать AudioContext при загрузке страницы, а затем вызвать возобновление после взаимодействия с пользователем:
const context = new AudioContext()
await context.audioWorklet.addModule('./worklet.js')
// wait for user interaction
await context.resume();
const worklet = new AudioWorkletNode(context, 'workletName')
worklet.connect(context.destination)
Я не уверен, почему это не сработало для вас, но последние версии Safari поддерживают (с некоторыми ошибками). Он не работает на страницах, обслуживаемых через http. Но он должен работать на страницах, обслуживаемых через https. Может быть, это было проблемой.
Если вы хотите поддерживать старые браузеры (которые не поддерживаютAudioWorklet
еще) вы можете попробовать стандартизированный аудиоконтекст или jariseon/audioworklet-polyfill или GoogleChromeLabs/audioworklet-polyfill или audioworkletpolyfill.js из проекта javascriptmusic.