当前位置: 首页 > 知识库问答 >
问题:

NodeJ使用缓冲区将二进制数据写入可写流

云季同
2023-03-14

下面的代码尝试使用缓冲区将WAV文件的头写入流,然后将其写入可写流。

  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);

共有1个答案

程谦
2023-03-14

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

=写(int)40(=0x28)在小端偏移量0。

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

 类似资料:
  • 我无法重写从二进制缓冲区获取的文件,我已与原始文件进行了检查,所有字节都相同。 这是从NodeJS创建的文件: 这是最初的一个: 你可以比较这两个文件,每个字节都是一样的,我猜NodeJS的编码不是正确的。 这是一段代码 你可以试着在你的节点上运行它,看看结果是错误的。 我能做些什么来修复它?

  • 我正试图将大量数据写入我的SSD(固态驱动器)。我指的是80GB。 我浏览了网页寻找解决方案,但我想出的最好的办法是: 使用Visual Studio 2010编译并进行全面优化并在Windows7下运行,该程序的最大容量约为20MB/s。真正让我困扰的是,Windows可以以150MB/s到200MB/s之间的速度将文件从其他SSD复制到此SSD。所以至少快了7倍。这就是为什么我认为我应该能够走

  • 问题 你想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。 或者你想原地修改数据并将它写回到一个文件中去。 解决方案 为了读取数据到一个可变数组中,使用文件对象的 readinto() 方法。比如: import os.path def read_into_buffer(filename): buf = bytearray(os.path.getsize(filena

  • 我有一个二进制数据缓冲区,我想存储在协议缓冲区中。 在留档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它说类型等价于C中的。我无法相信这一点,所以我不得不尝试它,是的,这似乎是这样... 本协议: 给出一个包含以下内容的消息定义: 公共setter/getter API如下所示: 当然,这不是在消息中存储二

  • 我想通过Android中的media player对象播放现场流媒体。 因此,我计划从源读取缓冲区数据,并将其写入媒体播放器的缓冲区,请注意,我不会使用任何URL为媒体播放器的流源,音频缓冲区数据将以字节形式通过输入流接收。 到目前为止,我可以使用音频跟踪对象,但该方法只适用于未压缩的PCM数据

  • 问题内容: 在Python中,您可以将StringIO用作字符数据的文件状缓冲区。内存映射文件基本上对二进制数据执行类似的操作,但是它需要一个用作基础的文件。Python是否有一个用于二进制数据且仅是内存的文件对象,相当于Java的ByteArrayOutputStream? 我的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。 问题答案: 您可能正在寻找io.Byt