Как пропустить n секунд вперед при воспроизведении трека с помощью веб-аудио API? - PullRequest
0 голосов
/ 20 января 2020

Используя Web Audio API, я пытаюсь создать mp3-плеер с функцией «Пропустить 15 секунд».

Я могу загрузить mp3, используя исходный буфер, и могу заставить его начать воспроизведение. Я хочу сделать что-то вроде этого, хотя я знаю, что currentTime не является настраиваемым свойством:

context.currentTime += 15

Как пропустить n секунд вперед, когда песня уже воспроизводится?

1 Ответ

4 голосов
/ 20 января 2020

К сожалению, нет единого вызова 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;

Это, конечно, упрощенный пример. В действительности должна быть проверка, чтобы удостовериться, что есть достаточно аудиоданных, чтобы пропустить вперед. Вы также можете применить небольшое постепенное увеличение / уменьшение при пропуске, чтобы избежать щелчков. ... Это только для иллюстрации общей идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...