我可以成功创建 16 位 wav 文件,但创建 24 位文件时,我听到的只是白噪声。我正在设置 24 位有符号整数数据块。我是否必须在 wav 文件头的第 20 字节处设置一些特殊的音频格式?我目前使用的是格式1。
Edit #1
The wBitsPerSample
字段设置为 24。wAvgBytesPerSec
(字节率)字段设置为
// 44100 * (2 * 3)
sampleRate * blockAlign
and wBlockAlign
被设定为
// 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)
}
}
and
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
}
这个过程是否尊重规范(看起来我正在做位移和屏蔽)setInt24
)?
Edit #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
}
to
DataView.prototype.setUint24 = function(pos, val, littleEndian) {
this.setUint8(pos, val & ~4294967040, littleEndian); // this "magic number" masks off the first 16 bits
this.setUint16(pos + 1, val >> 8, littleEndian);
}
成功了。我认为字节顺序不正确?我很困惑为什么取出最后一个字节并将其放在前两个字节之前是正确的顺序。
我还建议重新提出这个问题,因为它已经足够狭窄,不再被视为“广泛”。