W moim przypadku Chrome nagrywa audio z częstotliwością 96 kHz, a Firefox z częstotliwością próbkowania 44,1 kHz, co powoduje, że ogromne pliki WAV. I wdrożone funkcję przeprowadzający downsampling wewnątrz recorderWorker.js którym można wybrać współczynnik próbkowania chcesz, jak 16000.
function downsampleBuffer(buffer, rate) {
if (rate == sampleRate) {
return buffer;
}
if (rate > sampleRate) {
throw "downsampling rate show be smaller than original sample rate";
}
var sampleRateRatio = sampleRate/rate;
var newLength = Math.round(buffer.length/sampleRateRatio);
var result = new Float32Array(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] = accum/count;
offsetResult++;
offsetBuffer = nextOffsetBuffer;
}
return result;
}
i wzywam go podczas eksportowania do pliku wav:
function exportWAV(rate, type) {
var bufferL = mergeBuffers(recBuffersL, recLength);
var bufferR = mergeBuffers(recBuffersR, recLength);
var interleaved = interleave(bufferL, bufferR);
var downsampledBuffer = downsampleBuffer(interleaved, rate);
var dataview = encodeWAV(rate, downsampledBuffer, false);
var audioBlob = new Blob([ dataview ], {
type : type
});
this.postMessage(audioBlob);
}
Nice! Testuję to tak szybko, jak to możliwe! –
Inną strategią może być nie obliczenie średniej przepływności i rozważenie tylko jednej próbki na krok: 'result [offsetResult] = buffer [offsetBuffer];' –
To wydaje się działać dobrze. – Knelis