Javascript Safari-FFT中的Web音频API无法准确检测19k以上的频率

Javascript Safari-FFT中的Web音频API无法准确检测19k以上的频率,javascript,safari,fft,web-audio-api,frequency-analysis,Javascript,Safari,Fft,Web Audio Api,Frequency Analysis,我正在编写代码来检测使用Web音频API FFT播放的频率,目标是18kHz以上的高频。它在Chrome、Firefox和Edge中工作得非常完美,但在Safari中它非常不准确,并且不能记录超过19kHz的频率。Safari在努力检测最高频率时是否存在已知问题 我的代码如下: async connectMicAudio() { try { let stream; const constraints = {

我正在编写代码来检测使用Web音频API FFT播放的频率,目标是18kHz以上的高频。它在Chrome、Firefox和Edge中工作得非常完美,但在Safari中它非常不准确,并且不能记录超过19kHz的频率。Safari在努力检测最高频率时是否存在已知问题

我的代码如下:

    async connectMicAudio() {
        try {
            let stream;
            const constraints = {
                echoCancellation: false,
                noiseSuppression: false,
                autoGainControl: false,
                mozAutoGainControl: false,
                mozNoiseSuppression: false,
            };
            if (navigator.mediaDevices.getUserMedia) {
                stream = await navigator.mediaDevices.getUserMedia({
                    audio: true,
                });
            } else {
                navigator.getUserMedia = // account for different browsers
                    navigator.getUserMedia ||
                    navigator.webkitGetUserMedia ||
                    navigator.mozGetUserMedia ||
                    navigator.msGetUserMedia;

                stream = await navigator.getUserMedia({
                    audio: true,
                });
            }
            stream.getAudioTracks()[0].applyConstraints(constraints);
            this.audioStream = stream;
        } catch (error) {
            console.log('Error: ', error);
        }
        let stream = this.audioStream;
        const AudioContext = window.AudioContext || window.webkitAudioContext;
        const audioContext = new AudioContext();
        if (!this.sampleRate) {
            this.sampleRate = audioContext.sampleRate;
        }
        const analyser = audioContext.createAnalyser();
        analyser.fftSize = audioParams.FFT_SIZE;
        analyser.smoothingTimeConstant = 0;
        try {
            const microphone = audioContext.createMediaStreamSource(stream);
            microphone.connect(analyser);
        } catch {
            alert('Please allow microphone access.');
        }
        const processor = audioContext.createScriptProcessor(
            audioParams.BUFFER_SIZE,
            1,
            1
        ); // single channel audio (mono)
        processor.connect(audioContext.destination);

        this.analyser = analyser;
        this.processor = processor;
    }
然后,对于FFT,我使用:

this.processor.onaudioprocess = () => {
        let fftData = new Float32Array(analyser.frequencyBinCount);
        analyser.getFloatFrequencyData(fftData);
        let highPassed = highPass(fftData, this.sampleRate);
        let loudest = findLoudestFreqBin(highPassed, this.sampleRate);
        console.log('loudest: ', loudest);
};
这将从每个缓冲区提取频率数据,高通仅将18k以下的任何值归零,findLoudestFreqBin仅返回具有最高振幅的bin的中心点。当我在Safari上玩任何高于19k的游戏时,最高的振幅总是在18-19k范围内较低的音箱中


正如我所说,这段代码与其他浏览器完美配合,因此我假设这是Safari实现Web音频API的一个问题。如果有人遇到过类似的问题,并且知道一个解决方案,那将是一个巨大的帮助。

这些其他浏览器是否运行在相同的硬件和/或操作系统上?@PaulR是的,chrome firefox和safari都运行在新的MacBook air上。我的同事使用了MacBook pro和iPhone,这是同一个问题,只有safari失败,而其他浏览器工作正常。你能检查一下默认采样率在所有情况下都是相同的吗?(例如,如果Safari默认值为44.1 kHz,其他浏览器默认值为48 kHz,这就可以解释了。)否则,我接下来要做的就是转储一些时域帧并绘制它们,看看是否有任何明显的差异。这些其他浏览器是否在同一硬件和/或操作系统上运行?@PaulR yes,chrome firefox和safari都在新款MacBook air上运行。我的同事使用了MacBook pro和iPhone,这是同一个问题,只有safari失败,而其他浏览器工作正常。你能检查一下默认采样率在所有情况下都是相同的吗?(例如,如果Safari默认值为44.1 kHz,其他默认值为48 kHz,这就可以解释了。)否则,我接下来要做的就是转储一些时域帧并绘制它们,看看是否有任何明显的差异。