stream-audio-level
Version:
Watch MediaStream audio level
77 lines • 2.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.watchStreamAudioLevel = void 0;
const averageFreqData = (bin, sampleRate, minHz, maxHz) => {
let sum = 0;
let n = 0;
const binCount = bin.length;
for (let i = 0; i < binCount; i++) {
const hz = (i * sampleRate) / binCount;
if (minHz !== undefined && hz < minHz) {
continue;
}
if (maxHz !== undefined && hz > maxHz) {
continue;
}
sum += bin[i];
n++;
}
const average = sum / n;
return average;
};
const maxFreqData = (bin, sampleRate, minHz, maxHz) => {
let maxVal = -Infinity;
const binCount = bin.length;
for (let i = 0; i < binCount; i++) {
if (maxVal < bin[i]) {
const hz = (i * sampleRate) / binCount;
if (minHz !== undefined && hz < minHz) {
continue;
}
if (maxHz !== undefined && hz > maxHz) {
continue;
}
maxVal = bin[i];
}
}
return maxVal;
};
exports.watchStreamAudioLevel = (stream, onUpdate, opt) => {
const calcMethod = (opt && opt.calcMethod) || 'average';
const valueType = (opt && opt.valueType) || 'byte';
const AudioContext = window.AudioContext || window.webkitAudioContext;
const audioContext = new AudioContext();
const analyser = audioContext.createAnalyser();
const mediaStreamSource = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(2048, 1, 1);
analyser.smoothingTimeConstant = (opt && opt.smoothingTimeConstant) || 0.1;
analyser.fftSize = (opt && opt.fftSize) || 512;
mediaStreamSource.connect(analyser);
analyser.connect(processor);
processor.connect(audioContext.destination);
const calcF = calcMethod === 'average' ? averageFreqData : maxFreqData;
const getFreqData = () => {
if (valueType === 'byte') {
const bin = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(bin);
return bin;
}
const bin = new Float32Array(analyser.frequencyBinCount);
analyser.getFloatFrequencyData(bin);
return bin;
};
const handler = () => {
const bin = getFreqData();
const v = calcF(bin, audioContext.sampleRate, opt && opt.minHz, opt && opt.maxHz);
onUpdate(v);
};
processor.onaudioprocess = handler;
return () => {
processor.removeEventListener('audioprocess', handler);
analyser.disconnect(processor);
processor.disconnect(audioContext.destination);
mediaStreamSource.disconnect(analyser);
audioContext.close();
};
};
//# sourceMappingURL=index.js.map