主要分布三部分:
第一部分:开始录音 ;第二部分:停止录音;第三部分:静默监听。
一、开始录音
代码如下:
document.getElementById('startRecording').onclick = async function() {
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
try {
audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
audioContext = new (window.AudioContext || window.webkitAudioContext)();
const input = audioContext.createMediaStreamSource(audioStream);
analyserNode = audioContext.createAnalyser();
analyserNode.fftSize = 2048;
input.connect(analyserNode);
recorder = new Recorder(input);
recorder.record();
document.getElementById('startRecording').disabled = true;
document.getElementById('stopRecording').disabled = false;
monitorSilence();
} catch (e) {
alert('Unable to access microphone');
console.error(e);
}
} else {
alert('getUserMedia not supported in this browser');
}
};
开始录音按钮点击事件:
检查浏览器是否支持getUserMedia,用于获取音频流。
如果支持,获取音频流并创建音频上下文和输入源。
创建分析节点并连接到输入源。
创建录音实例并开始录音。
禁用开始录音按钮,启用停止录音按钮。
调用monitorSilence函数开始监控静音。
二、终止录音
代码如下:
document.getElementById('stopRecording').onclick = stopRecording;
function stopRecording() {
if (audioStream) {
audioStream.getTracks().forEach(track => track.stop());
}
recorder.stop();
recorder.exportWAV(function(blob) {
const url = URL.createObjectURL(blob);
const audio = document.getElementById('audioPlayback');
audio.src = url;
const downloadLink = document.getElementById('downloadLink');
downloadLink.href = url;
downloadLink.download = 'recorded_audio.wav';
downloadLink.style.display = 'block';
});
document.getElementById('startRecording').disabled = false;
document.getElementById('stopRecording').disabled = true;
}
停止录音按钮点击事件:
停止音频流。
停止录音。
导出录制的音频为WAV格式,并创建下载链接。
启用开始录音按钮,禁用停止录音按钮。
三、静默监听
代码如下:
function monitorSilence() {
const bufferLength = analyserNode.fftSize;
const dataArray = new Uint8Array(bufferLength);
const checkSilence = () => {
analyserNode.getByteFrequencyData(dataArray);
const average = dataArray.reduce((sum, value) => sum + value, 0) / bufferLength;
const db = 20 * Math.log10(average / 128);
if (db < silenceThreshold) {
if (!silenceTimeout) {
silenceTimeout = setTimeout(stopRecording, silenceDelay);
}
} else {
clearTimeout(silenceTimeout);
silenceTimeout = null;
}
requestAnimationFrame(checkSilence);
};
checkSilence();
}
监控静音:
创建一个数组用于存储分析节点的频率数据。
定义一个函数checkSilence,获取频率数据并计算平均值。
将平均值转换为分贝值,并与静音阈值进行比较。
如果低于阈值,启动静音定时器,超过延迟时间则停止录音。
如果高于阈值,清除静音定时器。
使用requestAnimationFrame循环调用checkSilence函数。