在 javascript 中对 PCM 音频缓冲区进行下采样
Downsampling a PCM audio buffer in javascript
我正在尝试对从audioContext获得的采样率进行下采样。我相信它在 44100 进去,我希望它是 11025。我以为我可以平均每 3 个样本,它以正确的速率播放,但音调太高,好像我们都在氦气上。
将 float32Array 从 44100 下采样到 int16Array 的正确方法是什么?
var context = new Flash.audioContext();
var audioInput = context.createMediaStreamSource(stream);
var recorder = context.createScriptProcessor(null, 1, 1);
recorder.onaudioprocess = onAudio;
audioInput.connect(recorder);
recorder.connect(context.destination);
var onAudio = function (e) {
var left = e.inputBuffer.getChannelData(0);
bStream.write(Flash.convertFloat32ToInt16(left));
}
var convertFloat32ToInt16 = function(buffer) {
var l = buffer.length;
var point = Math.floor(l/3);
var buf = new Int16Array(point);
for (var x = l; x > 0;) {
var average = (buffer[x] + buffer[x-1] + buffer[x-2]) / 3;
buf[point] = average*0x7FFF;
point -= 1;
x -= 3;
}
return buf.buffer;
}
对于其他需要答案的人。
var downsampleBuffer = function (buffer, sampleRate, outSampleRate) {
if (outSampleRate == sampleRate) {
return buffer;
}
if (outSampleRate > sampleRate) {
throw "downsampling rate show be smaller than original sample rate";
}
var sampleRateRatio = sampleRate / outSampleRate;
var newLength = Math.round(buffer.length / sampleRateRatio);
var result = new Int16Array(newLength);
var offsetResult = 0;
var offsetBuffer = 0;
while (offsetResult < result.length) {
var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
var accum = 0, count = 0;
for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
accum += buffer[i];
count++;
}
result[offsetResult] = Math.min(1, accum / count)*0x7FFF;
offsetResult++;
offsetBuffer = nextOffsetBuffer;
}
return result.buffer;
}
这将返回小于传递给它的采样率,同时将其转换为 int16Array 而不是 float32。
相关文章:
- Javascript-分层采样
- 从媒体源源缓冲区动态附加和删除mpeg短划线段
- Node.js服务器和浏览器之间共享二进制缓冲区
- 将ajax数组缓冲区响应绘制到画布中
- 是否可以将流同步转换为缓冲区
- 从 Node.js 模块中的缓冲区实例中逐行读取字符串
- Protocol Buffers byte[] 数组到节点 Javascript 缓冲区
- 从数组中随机采样子集
- 环形缓冲区 - Web 音频 API
- 使用 ajax 时没有从文本到数组缓冲区的转换
- Javascript:尝试从多个没有匹配的数组中采样,在不应该的时候循环递增
- 节点.js从 UTF8 文件创建十六进制缓冲区
- Three.js:如何创建新的'变形'如果我有所有必要的缓冲区
- 草皮缓冲区和一个可拖动的标记
- 如何将timbre.js缓冲区导出为.wav或任何其他音频文件格式
- 比较:用缓冲区视图调整ArrayBuffer的大小(Uint8 vs Float64),我是不是遗漏了什么
- HTML5将png缓冲区加载到画布中(用于流媒体目的)
- Recorderjs:缓冲区总是空的
- 转换Web音频API中的采样率
- 在 javascript 中对 PCM 音频缓冲区进行下采样