AudioBufferSourceNode.start() завершается с ошибкой в Safari ТОЛЬКО при запуске со смещением

#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 тест, чтобы исправить еще одну ложную ошибку, поэтому мне интересно, устранило ли это и эту проблему. Спасибо за вашу помощь!