Проигрыватели аудио предварительно загружают аудиофайлы? - PullRequest
0 голосов
/ 19 июня 2019

Я создаю аудиоплеер, используя Electron и Web Audio API .Мой текущий подход к открытию и воспроизведению аудиофайлов выглядит следующим образом:

  1. Пользователь с собственным диалоговым окном выбирает аудиофайлы - он загружает пути к файлам в локальное хранилище (хранилище приложений)

  2. Нажатие «кнопки воспроизведения» считывает файл и преобразует его в буфер массива, чтобы файл был приемлем для Web Audio API.

const buffer = toArrayBuffer(fs.readFileSync(filePath));
const audioBuffer = await ctx.decodeAudioData(buffer);
const soundNode = new AudioBufferSourceNode(ctx, { buffer: 
audioBuffer });

Обычно этоработает достаточно хорошо.Когда я использую файлы размером более 5 МБ, открытие и преобразование, показанное выше, обычно занимает слишком много времени.Например, открытие 9 МБ файла заняло ~ 3 секунды .Это решение неприемлемо, и у меня есть несколько дополнительных вопросов.

  • Стоит ли «предварительно загружать» аудиофайлы в локальное хранилище, когда они открываются на шаге 1 (диалог открытия)?
  • Электрон с Web Audio API недостаточно эффективен, чтобы создать настольный плеер, работающий быстро с локальными файлами?(Надеюсь нет)

1 Ответ

0 голосов
/ 10 июля 2019

Аудиофайлы занимают много времени для декодирования, потому что, вызывая decodeAudioData, вы просите, чтобы он полностью декодировал все файлы одновременно в raw PCM.Если кто-то попытается открыть аудиофайл, который длится несколько часов, он будет делать ужасные вещи с вашим приложением, с точки зрения времени и памяти.Вместо этого вы можете взглянуть на MediaElementAudioSourceNode - он может принять <audio> элемент в качестве источника для веб-аудио:

https://developer.mozilla.org/en-US/docs/Web/API/MediaElementAudioSourceNode

...