Очевидно, что в узле анализатора Safari нет метода getFloatTimeDomainData Здесь вы можете увидеть ошибку . Я ищу аналогичную функцию, которая копирует текущую форму волны или данные во временной области в массив Float32Array и будет работать в браузере Safari.
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var buflen = 1024;
var buf = new Float32Array( buflen );
audioContext = new AudioContext();
MAX_SIZE = Math.max(4,Math.floor(audioContext.sampleRate/5000));
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.msGetUserMedia;
navigator.mediaDevices.getUserMedia({audio: true})
.then(function(stream) {
gotStreamPre(stream);
});
function gotStreamPre(stream) {
// Create an AudioNode from the stream.
mediaStreamSource = audioContext.createMediaStreamSource(stream);
// Connect it to the destination.
analyser = audioContext.createAnalyser();
analyser.fftSize = 2048;
mediaStreamSource.connect( analyser );
updatePitchPre();
}
function updatePitchPre( time ) {
if(analyser!=null){
var cycles = new Array;
analyser.getFloatTimeDomainData( buf );//not working on Safari
var ac = autoCorrelatePre( buf , audioContext.sampleRate );
if (ac > -1) {
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = window.webkitRequestAnimationFrame;
rafID = window.requestAnimationFrame( updatePitchPre );
}
}