I have a WAVE file with a wFormatTag
that is 3 (WAVE_FORMAT_IEEE_FLOAT
). Firefox treats WAVE_FORMAT_IEEE_FLOAT
files like WAVE_FORMAT_EXTENSIBLE
, which means that it expects that a WAVE_FORMAT_IEEE_FLOAT
file contains the extended part of the fmt chunk.
My file doesn't contain the extended part of the fmt chunk, which results in an error when decoding the file in Firefox: The buffer passed to decodeAudioData contains invalid content which cannot be decoded successfully.
This means I have to add wValidBitsPerSample
at byte 38, dwChannelMask
at byte 40 and SubFormat
at byte 44. What information should I be adding for those three header fields? What is the meaning of this information and how can I add them in the form of 8-16-32bits integers?
Thanks for the help :).
Here is the header information of my file:
console.log('ckID', String.fromCharCode(dataView.getUint8(0))); // R
console.log('ckID', String.fromCharCode(dataView.getUint8(1))); // I
console.log('ckID', String.fromCharCode(dataView.getUint8(2))); // F
console.log('ckID', String.fromCharCode(dataView.getUint8(3))); // F
console.log('cksize', dataView.getUint32(4, true)); // 65623058
console.log('WAVEID', String.fromCharCode(dataView.getUint8(8))); // W
console.log('WAVEID', String.fromCharCode(dataView.getUint8(9))); // A
console.log('WAVEID', String.fromCharCode(dataView.getUint8(10))); // V
console.log('WAVEID', String.fromCharCode(dataView.getUint8(11))); // E
console.log('ckID', String.fromCharCode(dataView.getUint8(12))); // f
console.log('ckID', String.fromCharCode(dataView.getUint8(13))); // m
console.log('ckID', String.fromCharCode(dataView.getUint8(14))); // t
console.log('ckID', String.fromCharCode(dataView.getUint8(15))); //
console.log('cksize', (dataView.getUint32(16, true))); // 16
console.log('wFormatTag', (dataView.getUint16(20, true))); // 3
console.log('nChannels', (dataView.getUint16(22, true))); // 2
console.log('nSamplesPerSec', (dataView.getUint32(24, true))); // 44100
console.log('nAvgBytesPerSec', (dataView.getUint32(28, true))); // 352800
console.log('nBlockAlign', (dataView.getUint16(32, true))); // 8
console.log('wBitsPerSample', (dataView.getUint16(34, true))); // 32
console.log('cbSize', (dataView.getUint16(36, true))); // 0
console.log('ckID', String.fromCharCode(dataView.getUint8(38))); // f
console.log('ckID', String.fromCharCode(dataView.getUint8(39))); // a
console.log('ckID', String.fromCharCode(dataView.getUint8(40))); // c
console.log('ckID', String.fromCharCode(dataView.getUint8(41))); // t
console.log('cksize', (dataView.getUint16(42, true))); // 4
console.log('dwSampleLength', (dataView.getUint16(46, true))); // 10876
console.log('ckID', String.fromCharCode(dataView.getUint8(50))); // d
console.log('ckID', String.fromCharCode(dataView.getUint8(51))); // a
console.log('ckID', String.fromCharCode(dataView.getUint8(52))); // t
console.log('ckID', String.fromCharCode(dataView.getUint8(53))); // a
According to https://bugzilla.mozilla.org/show_bug.cgi?id=1349658, Firefox doesn't support float32 WAV files.
来源:https://stackoverflow.com/questions/44976805/wave-file-extended-part-of-fmt-chunk