2013-10-23 98 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

確實是這個問題。謝謝 ! –

相關問題