Чтение с микрофона в .wav

#javascript #arrays #wav

#javascript #массивы #wav

Вопрос:

Я читаю с микрофона и сохраняю записи в .файл wav.Я провел много исследований, и вот какое пришло лучшее решение: ссылка

Мой вопрос в том, что означает 44 в

 var buffer = new ArrayBuffer(44   interleaved.length * 2);
  

соответствует.

Что я понял к этому моменту, так это то, что мы создали буфер, в котором записи сохраняются в формате i Byte.Но чему соответствуют 44 ядра и почему interleaved.length*2 хотя чередование соответствует обоим каналам, левому и правому???

Ответ №1:

Это связано с форматом данных. ArrayBuffer используется для хранения необработанных байтов. Этот вопрос касается формата WAV

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, равная 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;
}
  

Комментарии:

1. спасибо, что было полезно, а как насчет (0x7FFF * volume)? что это значит?

2. Вы должны отметить, что вопрос касается формата WAV .. 0x7FFFF равно 2 ^ 15-1. Это битовая манипуляция с данными в чередовании, вероятно, для увеличения громкости.. Я предполагаю, что это математический трюк с фиксированной запятой, позволяющий избежать использования математики с плавающей запятой

3. Я пытался найти веб-сайт, который подробно описывает этот код, но я не могу найти, если вы можете мне с чем-либо помочь, например, что делают функции merge и interleave??

4. Я добавил ссылку на спецификацию WAV. Также спецификация W3Org (в статье) dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html Чередование и слияние объясняются в статье..