You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确等待navigator.getUserMedia执行完成?

优化Recorder初始化的异步流程

你的问题核心是navigator.getUserMedia是异步操作,创建Recorder的代码执行时,input还没被赋值,所以出现未定义的情况。固定超时的方式不可靠,推荐以下两种更严谨的优化方案:

方案一:在异步回调内直接创建Recorder

把创建Recorder的逻辑放在getUserMedia的成功回调里,确保input已经被正确初始化后再执行:

const audioSetter = new AudioContext();
let rec;
let gumStream;

navigator.getUserMedia(
    { audio: true },
    (stream) => {
        gumStream = stream;
        const input = audioSetter.createMediaStreamSource(stream);
        // 此时input已就绪,直接初始化Recorder
        rec = new Recorder(input, { numChannels: 1 });
        // 在这里可以执行Recorder的后续操作,比如开始录制
        // rec.record();
    },
    (err) => console.log(`No live audio input: ${err}`)
);

方案二:用Promise包装API,结合async/await控制流程

使用标准的navigator.mediaDevices.getUserMedia(旧版navigator.getUserMedia已废弃),将其包装为Promise后,通过async/await让异步代码同步化,流程更清晰:

async function initAudioRecorder() {
    try {
        const audioSetter = new AudioContext();
        // 等待媒体流获取完成
        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
        const gumStream = stream;
        const input = audioSetter.createMediaStreamSource(stream);
        // input就绪后创建Recorder
        const rec = new Recorder(input, { numChannels: 1 });
        // 执行后续操作
        // rec.record();
        return rec;
    } catch (err) {
        console.log(`No live audio input: ${err}`);
    }
}

// 调用初始化函数
initAudioRecorder();

你之前尝试async/await没效果,大概率是没有正确将getUserMedia的异步逻辑用Promise包裹,或者在await之前就执行了创建Recorder的代码,导致异步流程没有被正确控制。

内容的提问来源于stack exchange,提问作者VladTbk321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:07:51