2013-10-23 78 views
0

以下代码尝试使用缓冲区将WAV文件的标头写入流 ,然后将其写入WritableStream。nodejs使用缓冲区将二进制数据写入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() 

出于某种原因,前8个字节的文件是错误的:

 
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| 

第一行应该是:

 

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

更新:

此行有过错:

b.writeUInt32LE(40, 0); 

它需要是:

b.writeUInt32LE(0, 40); 

回答

2

前8位是由b.writeUInt32LE(40, 0);写入。

=写入(INT)40(0×28 =)的小端偏移量为0。

我不知道你想要什么,但是这就是问题所在。

+0

确实是这个问题。谢谢 ! –