javascript - 如何在javascript中制作声音文件?

标签 javascript audio buffer

我想制作一个代码,以WAV格式生成声音文件。但是,我在尝试演奏时遇到了麻烦。这是我到目前为止所做的:

var fs = require("fs");
var buf = new Buffer(176400);
var fileName = "i_write_this_wave.wav";
var fd = fs.openSync(fileName, "w");
buf.writeUInt32BE(0x52494646, 0);
buf.writeUInt32LE(0x24080000, 4);
buf.writeUInt32BE(0x57415645, 8);
buf.writeUInt32BE(0x666d7420, 12);
buf.writeUInt32LE(0x10000000, 16);
buf.writeUInt16LE(0x0100, 20);
buf.writeUInt16LE(0x0200, 22);
buf.writeUInt32LE(0x22560000, 24);
buf.writeUInt32LE(0x88580100, 28);
buf.writeUInt16LE(0x0400, 32);
buf.writeUInt16LE(0x1000, 34);
buf.writeUInt32BE(0x64617461, 36);
buf.writeUInt32LE(0x00080000, 40);
var vl = 32000;
var of = 44;
while (of < 176400) {
buf.writeUInt16LE(vl, of);
of = of + 2;
}
fs.writeSync(fd, buf, 0, buf.length);

它使wav文件具有正确的标题等,但我无法播放。我认为缓冲区大小有问题,但是正确的缓冲区大小应该是多少?如果您有任何建议,请在这里与他们联系。

最佳答案

您正在滥用writeUInt16LEwriteUInt32LE。例如,如果要以Little Endian编写32位整数0x5622,则应使用

buf.writeUInt32LE(0x5622, 24);

您将反转以little endian写入的每个值,从而导致这些值以big endian出现在文件中,这将导致文件无效。

具体来说,这是我如何重写您的代码:
var fs = require("fs");
var buf = new Buffer(176400);
var fileName = "i_write_this_wave.wav";
var fd = fs.openSync(fileName, "w");
buf.writeUInt32BE(0x52494646, 0);
buf.writeUInt32LE(buf.length-8, 4);
buf.writeUInt32BE(0x57415645, 8);
buf.writeUInt32BE(0x666d7420, 12);
buf.writeUInt32LE(0x10, 16);
buf.writeUInt16LE(0x01, 20);
buf.writeUInt16LE(0x02, 22);
buf.writeUInt32LE(0x5622, 24);
buf.writeUInt32LE(0x15888, 28);
buf.writeUInt16LE(0x04, 32);
buf.writeUInt16LE(0x10, 34);
buf.writeUInt32BE(0x64617461, 36);
buf.writeUInt32LE(buf.length-44, 40);
var vl = 32000;
var of = 44;
while (of < 176400) {
    buf.writeUInt16LE(vl, of);
    of = of + 2;
}
fs.writeSync(fd, buf, 0, buf.length);

关于javascript - 如何在javascript中制作声音文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659844/

相关文章:

python - 具有数百个削减的 ffmpeg 性能 (atrim)

Vim - 写入更改的缓冲区时执行命令

c - 如何清除 C 中的输入缓冲区?

javascript - 在 event.preventDefault() 之后在 iOS Safari 上手动捏合缩放事件处理;

在写入变量的 div 图像之前,Javascript/jquery 确认预图像加载

c++ - 使用 ffmpeg 解码 AAC 音频

在 C 中的缓冲区中调用程序集

javascript - 收藏一定要有模型吗?

javascript - 如何在 chartjs 中将 Y 轴值从 float 更改为整数?

ios - 测量两个短音频相似度的最简单算法