从麦克风读到.wav

时间:2014-07-04 06:16:19

标签: javascript arrays wav

我正在从麦克风中读取并将录音保存在.wav文件中。我做了大量研究,这是最佳解决方案:  link

我的问题是

中的44是什么
var buffer = new ArrayBuffer(44 + interleaved.length * 2);

对应。

我在这一点上所理解的是,我们创建了一个缓冲区,其中录制文件被保存为i字节格式。但是44对应于什么interleaved.length*2,尽管交错对应于左右两个通道???

1 个答案:

答案 0 :(得分:2)

这与数据格式有关。 ArrayBuffer用于存储原始字节。 这个问题与WAV format

有关

44个字节用于标题,如下所示:

writeUTFBytes(view, 0, 'RIFF');              //Magic word identifying the stream (4 bytes)
view.setUint32(4, 44 + interleaved.length * 2, true); //Size of stream in bytes (4 bytes)
writeUTFBytes(view, 8, 'WAVE');              //Another magic word (4 bytes)
// FMT sub-chunk
writeUTFBytes(view, 12, 'fmt ');            //format header (4bytes)
view.setUint32(16, 16, true);               //4 bytes size of format  (16 bytes)
view.setUint16(20, 1, true);                //2 bytes audio format
// stereo (2 channels)
view.setUint16(22, 2, true);               //2 bytes apparently number of channels
view.setUint32(24, 44100, true);           //4 bytes sample rate
view.setUint32(28, 44100 * 4, true);       //4 bytes byte rate
view.setUint16(32, 4, true);               //2 bytes block align
view.setUint16(34, 16, true);              //2 bytes bits per sample
// data sub-chunk
writeUTFBytes(view, 36, 'data');           //'data' == 4 bytes
view.setUint32(40, interleaved.length * 2, true);

然后我们来到实际数据,即Int16的interleaved.length,即每个项目2个字节..

// write the PCM samples
var lng = interleaved.length;
var index = 44;
var volume = 1;
for (var i = 0; i < lng; i++){
    view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);
    index += 2;
}