我使用js和WebRTC开发了一个基于Web的监控系统,现在我想开发声音超出一定水平时的通知功能。
我正在获得视频和音频的许可,在获得许可后,我想使用声音通知功能。
navigator.mediaDevices
.getUserMedia({
audio: true,
video: true
})
.then(stream => {
// Display your local video in #localVideo element
localVideo.srcObject = stream;
// Add your stream to be sent to the conneting peer
pc.addStream(stream);
// call function for sound check
}, onError);
您可以使用此代码。
<!DOCTYPE html>
<html>
<head>
<script>
navigator.mediaDevices.getUserMedia({ audio: true }).then(function(stream) {
audioContext = new AudioContext();
analyser = audioContext.createAnalyser();
microphone = audioContext.createMediaStreamSource(stream);
javascriptNode = audioContext.createScriptProcessor(2048, 1, 1);
analyser.smoothingTimeConstant = 0.8;
analyser.fftSize = 1024;
microphone.connect(analyser);
analyser.connect(javascriptNode);
javascriptNode.connect(audioContext.destination);
javascriptNode.onaudioprocess = function() {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var values = 0;
var length = array.length;
for (var i = 0; i < length; i++) {
values += (array[i]);
}
var average = values / length;
if(Math.round(average)>15)
{
console.log(Math.round(average));
document.getElementById("lvl").innerHTML = Math.round(average)-10;
}
}
})
.catch(function(err) {
/* handle the error */
});
</script>
</head>
<center><p id="lvl" style="font-size:200px"></p><center>
</html>
复制并使其成为 HTML 文件,然后在 chrome 中打开它并发出一些声音。您将了解它是如何工作的,以及它是否与您需要从第 5 行复制函数并将其设为一个单独的函数并调用此函数是您的代码相同。
希望它对你有用
这是一个不使用 onaudioprocess 的更新片段:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<center><p id="lvl" style="font-size:200px"></p><center>
<script>
navigator.mediaDevices.getUserMedia({ audio: true }).then(function(stream) {
const audioContext = new AudioContext();
const analyser = audioContext.createAnalyser();
const microphone = audioContext.createMediaStreamSource(stream);
analyser.smoothingTimeConstant = 0.8;
analyser.fftSize = 1024;
microphone.connect(analyser);
setInterval(() => {
const array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
let sum = 0;
for (let i = 0; i < array.length; i++) {
sum += array[i];
}
const average = sum / array.length;
if (Math.round(average) > 15) {
document.getElementById("lvl").textContent = Math.round(average) - 10;
}
}, 100);
}).catch(function(err) {
console.error('Error accessing microphone: ', err);
});
</script>
</body>
</html>