Javascript 要创建一个24位WAV文件,我需要做什么特殊的事情吗?
我可以成功地创建一个16位wav文件,但当创建一个24位文件时,我听到的只是白噪声。我正在设置24位有符号整数数据块。我必须在wav文件头的字节20设置一些特殊的音频格式吗?我目前使用的是格式1 编辑#1Javascript 要创建一个24位WAV文件,我需要做什么特殊的事情吗?,javascript,wav,audio-processing,audioformat,Javascript,Wav,Audio Processing,Audioformat,我可以成功地创建一个16位wav文件,但当创建一个24位文件时,我听到的只是白噪声。我正在设置24位有符号整数数据块。我必须在wav文件头的字节20设置一些特殊的音频格式吗?我目前使用的是格式1 编辑#1 wBitsPerSample字段设置为24。wAvgBytesPerSec(字节率)字段设置为 // 44100 * (2 * 3) sampleRate * blockAlign // 2 * 3 numChannels * bytesPerSampe 并且wBlockAlign设置为
wBitsPerSample
字段设置为24。wAvgBytesPerSec
(字节率)字段设置为
// 44100 * (2 * 3)
sampleRate * blockAlign
// 2 * 3
numChannels * bytesPerSampe
并且wBlockAlign
设置为
// 44100 * (2 * 3)
sampleRate * blockAlign
// 2 * 3
numChannels * bytesPerSampe
假设您已经这样做了,数据本身需要是24位对接(需要位移位和屏蔽,除非数据已经来自24位字节源)。或者换一种说法:每个样本将占用3个字节。与16位一样,字节顺序也很重要
不过,我不知道我是不是把这部分搞错了
我的数据以Float32的形式出现,从-1到1(AudioBuffer.getChannelData()
)。然后将其转换为Int24:
function floatTo24BitPCM(output, offset, input) {
for (var i = 0; i < input.length; i++, offset += 3) {
var s = Math.floor(input[i] * 8388608 + 0.5)
output.setInt24(offset, s, true)
}
}
这个过程是否尊重规范(好像我正在setInt24
中进行位移位和掩蔽)
编辑#2
修改
DataView.prototype.setInt24 = function(pos, val, littleEndian) {
this.setInt16(pos, val >> 8, littleEndian);
this.setInt8(pos+2, val & ~4294967040, littleEndian); // this "magic number" masks off the first 16 bits
}
到
成功了。我假设字节顺序不正确?我不明白为什么取最后一个字节并放在前两个字节之前是正确的顺序
我还建议重新打开这个问题,因为它已经足够窄,不能再被认为是“宽泛的”了。从文章中有限的上下文来看- 字段
wBitsPerSample
(在fmt->fmt ck
格式特定块中,对wFormatTag
使用1(PCM)是可以的)必须反映每个样本的位数,即在这种情况下为24
假设您已经这样做了,数据本身需要是24位对接(需要位移位和屏蔽,除非数据已经来自24位字节源)。或者换一种说法:每个样本将占用3个字节。与16位一样,字节顺序也很重要
wAvgBytesPerSec
和wBlockAlign
与之前一样使用新的位大小进行计算。您可以发布一些代码来帮助我们找出错误所在吗?请查看我的编辑以了解相关代码。请查看我的编辑以了解与您的答案相关的更多信息。我认为您为我指明了正确的方向与16位一样,字节顺序也很重要。
。如果您有时间添加说明,请查看我的编辑。谢谢@是的,这是一个字节顺序问题。在旧的变体中,字节在需要按顺序排列时更容易被“洗牌”。little endian反转顺序(16位写入),然后在错误的一端添加MSB(此处为最高有效字节)或LSB。在新的变型中,顺序是应该的。