使用 safari (Macos) 录制音频似乎在 12 KHz 左右中断

Sau*_*dey 7 safari audio web-audio-api

我正在研究网络音频 API。我尝试使用 Web Audio API 录制音频文件,保存录制的块,然后使用 python matplotlib 绘制同一块的频谱。

播放的音频文件包含从 2KHz 到 20KHz 递增的频率。

chrome 的音频录制似乎是正确的,我可以通过音频频谱正确地看到它。

从 Chrome 录制的音频文件

但是当从 safari 录制音频时,12 Khz 之后似乎有一个截止滤波器。

从 Safari 录制的音频文件

单击按钮时调用 Web 音频代码函数 start_rec()

var samplerate = 48000;
var audio_engine_var = {};


var samples = {
    audio_samples: [],
    samplerate: samplerate
}

function start_rec() {
    audio_engine_var.context = new AudioContext({sampleRate:samplerate});
    navigator.mediaDevices.getUserMedia(
        { audio: {
            echoCancellation: false,
            sampleRate: 48000
        } }
    ).then( function (stream) {
        audio_engine_var.stream = stream;
        audio_engine_var.track = audio_engine_var.stream.getAudioTracks()[0];
        audio_engine_var.track.applyConstraints(
            {
                echoCancellation: false,
                sampleRate: 48000
            }
        );
        audio_engine_var.scriptProcessor = audio_engine_var.context.createScriptProcessor(1024, 1, 1);
        audio_engine_var.scriptProcessor.onaudioprocess = function(e) {
            let aquired_samples = e.inputBuffer.getChannelData(0);
            aquired_samples.forEach(element => {
                samples.audio_samples.push(element);
            });
        }
        audio_engine_var.input = audio_engine_var.context.createMediaStreamSource(audio_engine_var.stream);
        audio_engine_var.scriptProcessor.connect(audio_engine_var.context.destination)
        audio_engine_var.input.connect(audio_engine_var.scriptProcessor);

        setTimeout(function() {
            download_samples();
        }, 15 * 1000) // stop recording and download audio samples.
    });
}


function download_samples(){
    // stop audio engine
    audio_engine_var.context.close();    
    audio_engine_var.scriptProcessor.disconnect() ;

    // download_audio
    var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(samples));
    var downloadAnchorNode = document.createElement('a');
    downloadAnchorNode.setAttribute("href",     dataStr);
    downloadAnchorNode.setAttribute("download", "audio.json");
    document.body.appendChild(downloadAnchorNode); // required for firefox
    downloadAnchorNode.click();
    downloadAnchorNode.remove();
    setTimeout(function() {
        window.location.reload();
    }, 200 ) // stop recording and download audio samples.
}
Run Code Online (Sandbox Code Playgroud)