2013-02-12 24 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

它既不是很直觀,也沒有在規範明確記錄,並還算不上很容易在網絡上找到:

但是,你可以簡單地修改它由getChannelData(<idx of channel>)任何緩衝返回Float32Array

不要忘記你的樣本擴展到範圍[-1,1]

您的例子中,你會規模,在intArray的值複製到所獲得的floatArray致電:

floatArray = buffer.getChannelData(0) 
+0

好吧,它被記錄,getChannelData返回一個Float32Array。 :)但是,是的,這正是要做到這一點。 – cwilso 2013-02-13 06:04:15

+0

@cwilso,是的,但名稱似乎暗示它是隻讀的。 – kr1 2013-02-13 07:13:09

+0

哇!感謝您的快速answare!它的工作! 我還沒有想出解決這個問題的最好方法,因爲Float32Array是固定大小的,並且似乎沒有辦法以新的大小重新初始化陣列。 我不知道是否有另一種方式,但現在我必須加載一個空的wav文件作爲比我的任何內存樣本更大的源,然後插入樣本。 也許我需要一個空緩衝區的所有樣本。 我至少感動,謝謝! – Perty 2013-02-13 14:41:09