Boutran
Boutran

Reputation: 10144

nodejs write binary data into WritableStream with Buffer

The following code tries to write the header of a WAV file to a stream using a Buffer and then writing it to a WritableStream.

  var fs = require("fs") 

  var samplesLength = 1000;
  var sampleRate = 44100;

  var outStream = fs.createWriteStream("zaz.wav")

  var b = new Buffer(1024)        
  b.write('RIFF', 0);
  /* file length */    
  b.writeUInt32LE(32 + samplesLength * 2, 4);
  //b.writeUint32LE(0, 4);

  b.write('WAVE', 8);
  /* format chunk identifier */
  b.write('fmt ', 12);

  /* format chunk length */
  b.writeUInt32LE(16, 16);

  /* sample format (raw) */
  b.writeUInt16LE(1, 20);
  /* channel count */
  b.writeUInt16LE(2, 22);
  /* sample rate */
  b.writeUInt32LE(sampleRate, 24);
  /* byte rate (sample rate * block align) */
  b.writeUInt32LE(sampleRate * 4, 28);
  /* block align (channel count * bytes per sample) */
  b.writeUInt16LE(4, 32);
  /* bits per sample */
  b.writeUInt16LE(16, 34);
  /* data chunk identifier */
  b.write('data', 36);
  /* data chunk length */

  //b.writeUInt32LE(40, samplesLength * 2);    
  b.writeUInt32LE(40, 0);


  outStream.write(b.slice(0,50))
  outStream.end()

For some reason, the first 8 bytes of the file are wrong :

hexdump -C zaz.wav 
00000000  28 00 00 00 f0 07 00 00  57 41 56 45 66 6d 74 20  |(.......WAVEfmt |
00000010  10 00 00 00 01 00 02 00  44 ac 00 00 10 b1 02 00  |........D.......|
00000020  04 00 10 00 64 61 74 61  80 5a 57 ac ef 04 00 00  |....data.ZW.....|
00000030  18 57                                             |.W|

The first line should be :


00000000  52 49 46 46 24 00 ff 7f  57 41 56 45 66 6d 74 20  |RIFF$...WAVEfmt |

Update :

this line is at fault :

b.writeUInt32LE(40, 0);

it needs to be :

b.writeUInt32LE(0, 40);

Upvotes: 1

Views: 5213

Answers (1)

Fabien Sa
Fabien Sa

Reputation: 9480

The first 8 bits are written by b.writeUInt32LE(40, 0);.

= write (int) 40 (= 0x28) in Little Endian at offset 0.

I don't know exactly what you want but this is the problem.

Upvotes: 2

Related Questions