#javascript #web-audio-api
#javascript #web-audio-api
Вопрос:
Иногда я пытаюсь начать воспроизведение буфера с определенным смещением. У меня есть объект, который я создаю следующим образом:
var directSource = AudioContext.createBufferSource();
Позже, после его инициализации, я вызываю:
directSource.start();
Это работает во всех браузерах.
Пользователь может пропустить, поэтому я мог бы остановить этот звук и повторно инициализировать все (он выполняет тот же код, что и в первый раз, за исключением того, что ему передается смещение) и вызвать start с:
directSource.start(0, offset);
Это работает в Chrome и Firefox, но эта конкретная строка вызывает InvalidStateError
в Safari, как на моем MacBookPro, так и на iPhone.
Если я заменю эту строку на:
directSource.start();
Тогда я НЕ получаю сообщение об ошибке.
Я протестировал аудиоконтекст, и он определенно находится в состоянии «running».
Я ставлю a console.log()
непосредственно перед вызовом start()
, чтобы убедиться, что я случайно не вызываю его дважды.
Кто-нибудь может помочь диагностировать, почему Safari не запускается со смещением? Есть ли где-нибудь еще, где я мог бы найти подсказку о том, что ему не нравится?
Спасибо!
Ответ №1:
Я думаю, проблема, с которой вы сталкиваетесь, заключается в том, что Safari в этом случае чрезвычайно требователен. Параметр offset должен быть меньше или равен длительности аудиобуфера в Safari.
В спецификации веб-аудио говорится, что «смещение автоматически фиксируется на [0, длительность]». (https://webaudio.github.io/web-audio-api/#dom-audiobuffersourcenode-start-when-offset-duration-offset) Но вместо этого Safari выдает ошибку.
Вы можете избежать этого, убедившись, что вы сами фиксируете значение.
bufferSource.start(
0,
Math.min(bufferSource.buffer.duration, offset)
);
Я автор пакета под названием standardized-audio-context. У него еще нет исправления для этого, но я уже создал проблему для него. Цель этого пакета — предоставить версию AudioContext
, которая работает почти одинаково в каждом браузере, и эта небольшая ошибка, безусловно, должна быть исправлена.
Комментарии:
1. Я думаю, что смещение уже меньше продолжительности, но я перепроверю.
2. Да, пожалуйста, дайте мне знать, если это не было причиной вашей проблемы.
3. Я больше не могу воспроизвести проблему — я не уверен почему, но я провел дополнительный
AudioContext.suspended
тест, чтобы исправить еще одну ложную ошибку, поэтому мне интересно, устранило ли это и эту проблему. Спасибо за вашу помощь!