К сожалению, нет единого вызова API для достижения желаемого эффекта, но это выполнимо. Каждый AudioBufferSourceNode
может использоваться только один раз, поэтому нам нужно создать новый, чтобы что-то изменить.
Давайте представим, что у нас есть две переменные, которые откуда-то называются audioContext
и audioBuffer
. Кроме того, мы определяем еще две переменные для хранения начального startTime
и текущего запущенного AudioBufferSourceNode
.
let audioBufferSourceNode;
let startTime;
При первом воспроизведении audioBuffer
мы воспроизводим его непосредственно с самого начала. Единственное, что здесь особенное, это то, что мы сохраняем ссылку на audioBufferSourceNode
и помним startTime
.
audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.buffer = audioBuffer;
audioBufferSourceNode.connect(audioContext.destination);
startTime = context.currentTime;
audioBufferSourceNode.start(startTime);
Если вы хотите пропустить какое-то время спустя, ранее начатые потребности audioBufferSourceNode
быть остановленным первым.
const currentTime = context.currentTime;
audioBufferSourceNode.stop(currentTime);
audioBufferSourceNode.disconnect();
Кроме того, необходимо создать новый, повторно используя тот же audioBuffer
, что и раньше. Единственное отличие состоит в том, что мы применяем смещение, чтобы оно пропускалось на 15 секунд вперед.
audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.buffer = audioBuffer;
audioBufferSourceNode.connect(audioContext.destination);
audioBufferSourceNode.start(currentTime, currentTime - startTime + 15);
Чтобы подготовиться к пропуску в другой раз, необходимо обновить startTime
.
startTime -= 15;
Это, конечно, упрощенный пример. В действительности должна быть проверка, чтобы удостовериться, что есть достаточно аудиоданных, чтобы пропустить вперед. Вы также можете применить небольшое постепенное увеличение / уменьшение при пропуске, чтобы избежать щелчков. ... Это только для иллюстрации общей идеи.