2013-02-12 1 views
1

Есть ли способ добавить необработанные данные из памяти в качестве образца в Web Audio Api? Я хотел бы добавить Int8Array (или Int16Array) в качестве буфера, в буфере есть только образцы и формат WAV или MP3. Я попробовал audioContext.createBuffer и без каких-либо успехов.Возможно создание AudioBuffer из памяти, т.е. Int8Array

Что-то вроде этого:

var buffer = audioContext.createBuffer(1,8192, 22000); 
var intArray = new Int8Array(....); 
// -- fill intarray 
buffer.buffer = intArray; 
... 
var source = context.createBufferSource(); 
source.buffer = buffer; 
source.connect(context.destination); 

Если это не возможно есть формат звука совместим с contetx.decodeAudio(), который легко «подражать» в памяти? Т.е. просто заголовок или что-то в этом роде.

ответ

4

Это не очень интуитивным, ни явно описаны в спецификации, а также не очень легко найти в сети:

, но вы можете просто изменить Float32Array, который возвращается getChannelData(<idx of channel>) на любом буфере.

не забудьте масштабировать свои образцы в диапазоне [-1, 1]

для вашего примера вы бы масштабировать и скопировать значения в INTArray к floatArray, полученного по телефону:

floatArray = buffer.getChannelData(0) 
+0

Ну, это задокументировано, что getChannelData возвращает Float32Array. :) Но да, это именно то, как это сделать. – cwilso

+0

@cwilso, да, но название, по-видимому, подразумевает, что оно доступно только для чтения. – kr1

+0

Вау! Спасибо за быстрое оповещение! И это сработало! Я не выяснил, как наилучшим образом решить проблему из-за того, что Float32Array имеет фиксированный размер и, похоже, не существует способа повторно установить массив с новым размером. Я не знаю, есть ли другой способ, но теперь я должен загрузить пустой wav-файл в качестве источника, который больше, чем любой из моих образцов памяти, а затем вставить в него образцы. Возможно, мне нужен пустой буфер для всех образцов. Я, по крайней мере, двигаюсь, спасибо! – Perty