You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS Safari调用getUserMedia开启麦克风录音时音频输出自动切换至扬声器的问题求助

iOS Safari调用getUserMedia开启麦克风录音时音频输出自动切换至扬声器的问题求助

大家好,我碰到一个挺头疼的iOS端音频问题,想请教下各位有没有解决方案!

我们的应用有个对话功能:用户对着麦克风和AI机器人说话,机器人通过音频回复。在单设备(不用耳机)的情况下一切正常,但只要用户使用带麦克风的有线/蓝牙耳机(比如AirPods),就会出现以下异常:

  • 录音开始前:音频播放完全正常,声音从耳机输出
  • 点击录音按钮并授予麦克风权限后:音频输出会自动切换到设备的扬声器,哪怕耳机全程都是连接状态

为了排查问题,我写了一个极简的复现页面,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Microphone Recorder</title>
</head>
<body>
    <h1>Microphone Recorder</h1>
    <button id="startBtn">Start Recording</button>
    <button id="stopBtn" disabled>Stop Recording</button>
       <audio id="audioPlayback" controls src="https://cdn.jsdelivr.net/npm/sample-audio-files@1.0.7/media/Justice_Genesis_16bit_trim_mono_y6iHYTjEyKU.wav" playsinline></audio>


    <script>
        let mediaRecorder;
        let audioChunks = [];

        document.getElementById('startBtn').addEventListener('click', async () => {
            try {
                const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
                mediaRecorder = new MediaRecorder(stream);
                audioChunks = [];

                mediaRecorder.ondataavailable = event => {
                    if (event.data.size > 0) {
                        audioChunks.push(event.data);
                    }
                };

                mediaRecorder.onstop = () => {
                    const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
                    const audioUrl = URL.createObjectURL(audioBlob);
                    document.getElementById('audioPlayback').src = audioUrl;
                };

                mediaRecorder.start();
                document.getElementById('startBtn').disabled = true;
                document.getElementById('stopBtn').disabled = false;
            } catch (error) {
                console.error('Error accessing microphone:', error);
            }
        });

        document.getElementById('stopBtn').addEventListener('click', () => {
            mediaRecorder.stop();
            document.getElementById('startBtn').disabled = false;
            document.getElementById('stopBtn').disabled = true;
        });
    </script>
</body>
</html>

复现步骤非常简单:

  1. 连接带麦克风的耳机
  2. 先播放页面里的音频,确认声音从耳机出来
  3. 点击「Start Recording」按钮并授权麦克风权限

这时就能明显听到音频输出从耳机切换到了设备扬声器。另外补充下,这个问题在Windows/macOS的Chrome上是完全正常的,只有iOS的Safari和Chrome会出现。我之前查到过一个标记为已修复的相关bug,但实际测试下来问题依然存在。

有没有朋友遇到过类似的问题?或者知道怎么强制音频输出保持在耳机上吗?麻烦指点一下!

备注:内容来源于stack exchange,提问作者Nix

火山引擎 最新活动