为什么 iOS 上的 Safari 会在一分钟后重新请求麦克风权限,即使我正在浏览同一选项卡而不重新加载它?

问题描述 投票:0回答:1

在 iOS 移动 Safari 浏览器中,即使我已经在同一选项卡会话中授予了麦克风权限提示,也会再次出现麦克风权限提示。如果上一次录制结束时间超过 60 秒,就会发生这种情况。 如果我在完成上一次录制后一分钟内尝试再次录制,则无需再次请求许可即可进行录制。但是,如果超过一分钟,浏览器会再次请求麦克风权限。

我有一个基本的录音机和可视化器 React 组件:

  const startRecording = async () => {
    navigator.mediaDevices
      .getUserMedia({ audio: true })
      .then((stream) => {
        // Recording the audio
        const recorder = new MediaRecorder(stream, { mimeType: "audio/wav" });
        recorder.ondataavailable = (e) => {
          const audioBlob = e.data;
          sendAudioToServer(audioBlob);
          // stops all tracks so tab record icon disappears in the end
          stream.getTracks().forEach((track) => track.stop());
        };
        recorder.start();
        setRecordStartTime(Date.now());
        setMediaRecorder(recorder);
        setIsRecording(true);

        // Visualizing the audio
        const audioContext = new AudioContext();
        const analyser = audioContext.createAnalyser();
        const microphone = audioContext.createMediaStreamSource(stream);

        analyser.smoothingTimeConstant = 0.8;
        analyser.fftSize = 1024;
        microphone.connect(analyser);

        const interval = setInterval(() => {
          const array = new Uint8Array(analyser.frequencyBinCount);
          analyser.getByteFrequencyData(array);
          setFrequencyArray(array);
        }, visualisationRefreshRate);
        setAnalyserInterval(interval);
      })
      .catch(() => {
        stopParentRecording({ status: "failedMic" });
      });
  };

  const stopRecording = () => {
    clearInterval(analyserInterval);
    if (mediaRecorder && isRecording) {
      temporarilyBlockHover();
      mediaRecorder.stop();
      setIsRecording(false);
    }
  };

当我删除这行代码时出现问题:

stream.getTracks().forEach((track) => track.stop());

如果没有此行,浏览器选项卡旁边的麦克风图标仍然可见,表明浏览器仍在录音,即使它没有录音。

The mic in use icon in a Safari browser

我希望能够在会话中授予权限后随时使用麦克风,而在完成录音后不会看到麦克风图标。

我尝试每 50 秒访问一次 MediaRecorder 以保持权限处于活动状态。虽然此方法有效,但红色麦克风图标在这些间隔期间不断出现大约 3 秒钟。这可能会提醒用户,让他们认为该应用程序正在间歇性地记录他们的对话。

javascript reactjs safari audio-recording
1个回答
0
投票

我也遇到同样的问题,请问你找到解决办法了吗?

© www.soinside.com 2019 - 2024. All rights reserved.