Question

I have a wav file which with: ffmpeg -i my.wav

Gives the output:

output:   Duration: 00:00:12.63, bitrate: 352 kb/s
    Stream #0.0: Audio: pcm_s16le, 22050 Hz, 1 channels, s16, 352 kb/s

This is stored as a base64 string in JavaScript loaded in memory as base64 variable listed below.

Here is the code:

byte_str = Base64.decode(base64)
buffer = new ArrayBuffer(byte_str.length*2)
buffer_view = new Uint16Array(buffer)
/* this is coffeescript */
for i in [0..byte_str.length]
   buffer_view[i] = byte_str.charCodeAt(i)
console.log(byte_str.length)
console.log(buffer_view)
console.log(buffer_view.buffer)
context = new webkitAudioContext()
context.decodeAudioData(buffer,function (buffer) {
    /* never gets hit */
    source = @context.createBufferSource()
    source.buffer = buffer
    source.connect(@context.destination)
    source.noteOn(0)
});

Output:

108185
[82, 73, 70, 70, 36, 128, 87, 65, 86, 69, 102, 109, 116, 32, 16, 0, 0, 0, 1, 0, 1, 0, 34, 86, 0, 0, 68, 49152, 2, 0, 16, 0, 100, 97, 116, 97, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,....]
ArrayBuffer {byteLength: 216370} 

If you look in this presentation it has a WAV header: http://html5-demos.appspot.com/static/html5-whats-new/template/index.html#29

var header = new Uint8Array([
    0x52,0x49,0x46,0x46, // "RIFF"
    0, 0, 0, 0,          // put total size here
    0x57,0x41,0x56,0x45,
    ...
]);

Which is identical to mine if you convert the first values to hex, yet on mine the callback never fires for decodeAudioData. Any ideas?

Was it helpful?

Solution

It turns out it was an encoding issue using this library: http://www.webtoolkit.info/javascript-base64.html I removed the _utf8_decode step and it worked great!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top