Я работаю над веб-приложением, которое показывает график на основе образцов микрофонов. Я беру наибольшее значение вектора возврата из getByteTimeDomainData каждые ~ 15 мс и помещаю его на график.
Проблема в том, что в некоторых телефонах (например, в телефонах Xiaomi) я получаю поддельные сэмплы микрофона - он возвращает то же самое вектор 10 раз (~ 150 мс), и только после этого он снова сэмплирует микрофон и возвращает новый вектор еще 10 раз.
Стандартные телефоны:
Самые высокие значения собранные из 30 звонков в getByteTimeDomainData: 230.237.237.236.236.220.220.232.232.218.218.214.214.217.217.227.227.222.222.224.224.222.222.216.216.202.202.223.223.205
1015 *
телефон Xiaomi: высокие значения собраны из 30 вызовов to getByteTimeDomainData: 132,132,132,132,132,132,132 , 129,129,129,129,129,129,129,129,129,129, 130,130,130,130,130,130,130,130,130,130 , 131,131,131
1027
1025 * 1025 улучшить его и получить больше образцов в Xiaomi?
var start_amp = function () {
'use strict';
var soundAllowed = function (stream) {
window.persistAudioStream = stream;
var audioContext = new AudioContext();
var audioStream = audioContext.createMediaStreamSource(stream);
var analyser = audioContext.createAnalyser();
audioStream.connect(analyser);
analyser.smoothingTimeConstant = 0; // = 1 doesn't fix the samples problem
analyser.fftSize = 1024;
var frequencyArray = new Uint8Array(analyser.frequencyBinCount);
var doDraw = function () {
requestAnimationFrame(doDraw);
analyser.getByteTimeDomainData(frequencyArray);
var max = 0;
for (var i = 0; i < frequencyArray.length; i++) {
if (max < frequencyArray[i]) {
max = frequencyArray[i];
}
}
boardArray.push(max);
if (boardArray.length >= document.body.clientWidth * 0.7) {
boardArray.shift();
totalSamples += 1;
if (totalSamples == 60) {
totalSamples = 0;
}
}
draw(boardArray);
}
doDraw();
}
var soundNotAllowed = function (error) {
alert('Please check your microphone connectivity and allow this site to access it');
console.log(error);
}
navigator.getUserMedia({ audio: true }, soundAllowed, soundNotAllowed);
}