作者:沿无际空间 | 来源:互联网 | 2023-05-24 12:49
我正在尝试对从audioContext获取的采样率进行下采样.我相信它是在44100,我希望它是11025.我想我可以平均每3个样本,它以正确的速率播放,但是音高太高,好像我们都在氦气.
在11025样本中将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;
}
Neablis..
15
对于任何需要答案的人.
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
这将返回小于传递给它的采样率,同时还将其转换为int16Array而不是float32.
1> Neablis..:
对于任何需要答案的人.
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
这将返回小于传递给它的采样率,同时还将其转换为int16Array而不是float32.