javascript - How do I convert an array of audio data into a wav file? -


i have feature records audio annotations user. uses html5 flash fallback. able audio data html5 version via getusermedia(), flash fallback provides data array of floats.

i need data wav file, , can't figure out how it. appreciated!

var reclength = 0, recbuffersl = [], recbuffersr = [], samplerate;  this.onmessage = function (e) { switch (e.data.command) {     case 'init':         init(e.data.config);         break;     case 'record':         record(e.data.buffer);         break;     case 'exportwav':         exportwav(e.data.type);         break;     case 'getbuffer':         getbuffer();         break;     case 'clear':         clear();         break; } };  function init(config) { samplerate = config.samplerate; }  function record(inputbuffer) { recbuffersl.push(inputbuffer[0]); recbuffersr.push(inputbuffer[1]); reclength += inputbuffer[0].length; }  function exportwav(type) { var bufferl = mergebuffers(recbuffersl, reclength); var bufferr = mergebuffers(recbuffersr, reclength); var interleaved = interleave(bufferl, bufferr); var dataview = encodewav(interleaved); var audioblob = new blob([dataview], {     type: type });  this.postmessage(audioblob); }  function getbuffer() { var buffers = []; buffers.push(mergebuffers(recbuffersl, reclength)); buffers.push(mergebuffers(recbuffersr, reclength)); this.postmessage(buffers); }  function clear() { reclength = 0; recbuffersl = []; recbuffersr = []; }  function mergebuffers(recbuffers, reclength) { var result = new float32array(reclength); var offset = 0; (var = 0; < recbuffers.length; i++) {     result.set(recbuffers[i], offset);     offset += recbuffers[i].length; } return result; }  function interleave(inputl, inputr) { var length = inputl.length + inputr.length; var result = new float32array(length);  var index = 0,     inputindex = 0;  while (index < length) {     result[index++] = inputl[inputindex];     result[index++] = inputr[inputindex];     inputindex++; } return result; }  function floatto16bitpcm(output, offset, input) { (var = 0; < input.length; i++, offset += 2) {     var s = math.max(-1, math.min(1, input[i]));     output.setint16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true); } }  function writestring(view, offset, string) { (var = 0; < string.length; i++) {     view.setuint8(offset + i, string.charcodeat(i)); } }  function encodewav(samples) { var buffer = new arraybuffer(44 + samples.length * 2); var view = new dataview(buffer);  writestring(view, 0, 'riff'); view.setuint32(4, 32 + samples.length * 2, true); writestring(view, 8, 'wave'); writestring(view, 12, 'fmt '); view.setuint32(16, 16, true); view.setuint16(20, 1, true); view.setuint16(22, 2, true); view.setuint32(24, samplerate, true); view.setuint32(28, samplerate * 4, true); view.setuint16(32, 4, true); view.setuint16(34, 16, true); writestring(view, 36, 'data'); view.setuint32(40, samples.length * 2, true);  floatto16bitpcm(view, 44, samples);  return view; } 

usage:

var audiocontext = win.webkitaudiocontext,     recorder, audiocontext;   function recordaudio() {     if (!config.stream) {         alert('no audio.');         return;     }     initaudiorecorder(config.audioworkerpath);     audiocontext = new audiocontext;     var mediastreamsource = audiocontext.createmediastreamsource(config.stream);      mediastreamsource.connect(audiocontext.destination);     recorder = new window.recorder(mediastreamsource);      recorder && recorder.record(); }  function stopaudiorecording() {     console.warn('audio recording stopeed');     recorder && recorder.stop();     recorder && recorder.exportwav(function (blob) {         filetype = 'wav';         setblob(blob);     });     recorder && recorder.clear(); }  var writer;  function setblob(blob) {     bloburl = blob;      var config = {         blob: bloburl,         type: 'audio/wav',         filename: (math.random() * 1000 << 1000) + '.' + filetype,         size: bloburl.length     };     writer = recordrtcfilewriter(config);      var reader = new win.filereader();     reader.readasdataurl(bloburl);     reader.onload = function (event) {         bloburl2 = event.target.result;     }; }  return {     stopaudio: stopaudiorecording,     stopvideo: stopvideorecording,     recordvideo: recordvideo,     recordaudio: recordaudio,     save: savetodisk,     getblob: function () {         return bloburl2;     },     tourl: function () {         return writer.tourl();     } }; 

Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -