Передача аудиоданных в HTML5
Я получаю аудиоданные PCM с сервера в небольших кусках и храня их в массиве. Теперь я хотел бы воспроизвести эти звуковые фрагменты последовательно без пробелов, используя некоторые возможности HTML5. Двумя вариантами, которые я рассматриваю как "возможные" решения, являются:
Пока я изучаю эти параметры, пожалуйста, предложите мне другой вариант или взгляды на два варианта, на которые я смотрю. Хотя кросс-платформенное решение будет лучшим, но я могу согласиться только на решение Chrome только как
Ответы
Ответ 1
Планирование аудио - это то, для чего был разработан API веб-аудио. Если у вас декодированные звуковые фрагменты PCM в виде типизированных массивов (AUDIO_CHUNKS
), вы можете создавать звуковые буферы для каждого фрагмента и назначать их в точное время (один за другим) с помощью noteOn()
. Что-то вроде:
var startTime = 0;
for (var i = 0, audioChunk; audioChunk = AUDIO_CHUNKS[i]; ++i) {
// Create/set audio buffer for each chunk
var audioBuffer = audioCtx.createBuffer(NUM_CHANNELS, NUM_SAMPLES, SAMPLE_RATE);
audioBuffer.getChannelData(0).set(audioChunk);
var source = audioCtx.createBufferSource();
source.buffer = audioBuffer;
source.noteOn(startTime);
source.connect(audioCtx.destination);
startTime += audioBuffer.duration;
}
Ответ 2
Вариант 1, вероятно, не будет работать, потому что звуковой тег не воспроизводит сырые аудиоданные (что я предполагаю, это то, что вы подразумеваете под аудиоданными PCM, или я ошибаюсь?). Каждый браузер нуждается в определенных кодеках. В довершение всего звуковой тег не является надежным, чтобы играть без пробелов.
Вариант 2 может работать. Веб-аудио api содержит буферы, которые, вероятно, могут быть заполнены сырыми данными и воспроизведены, но я никогда не пробовал это делать. Сейчас большой недостаток: а. Chrome только b. пользователь должен настроить хром, набрав флаги: флаги и включить веб-аудио, что может быть страшно для некоторых.
Третий вариант - это API аудиоданных, который представляет собой нечто среднее. Я никогда не пробовал это сам, но из спецификации это похоже на то, что вы ищете. Я не знаю о реализации, так что вам придется делать некоторые исследования самостоятельно:)
https://wiki.mozilla.org/Audio_Data_API#Writing_Audio
Пожалуйста, не то, что я даю эти ответы на моей голове, и я все еще довольно новичок в аудио HTML5.