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
Post a Comment