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

React移动端调用摄像头麦克风遇DOMException问题求助

React移动端(iPhone)调用摄像头/麦克风失败问题

问题描述

刚接触React,尝试调用摄像头和麦克风时遇到以下错误:

Error accessing media devices: DOMException { line: 1, column: 161443, sourceURL: "https://sample.com/user/static/js/838.d273e7b8.chunk.js" }

代码在桌面浏览器运行正常,但在iPhone的Brave、Chrome、Safari、Firefox浏览器中均无法工作,完整代码如下:

useEffect(() => {
    const setupMedia = async () => {
        try {
            const mediaStream = await navigator.mediaDevices.getUserMedia({
                video: { facingMode: 'user' },
                audio: true,
            })

            if (!MediaRecorder.isTypeSupported('video/webm')) {
                console.warn('video/webm is not supported')
                return
            }

            if (videoLiveRef.current) {
                videoLiveRef.current.srcObject = mediaStream
            }

            mediaRecorderRef.current = new MediaRecorder(mediaStream, {
                mimeType: 'video/webm',
            })

            mediaRecorderRef.current.addEventListener('dataavailable', (event) => {
                const blob = new Blob([event.data], { type: 'video/webm' })
                videoRecordedRef.current.src = URL.createObjectURL(blob)
                setAuthData({ type: 4, payload: { file: blob } })
                
            })
        } catch (error) {
            console.error('Error accessing media devices:', error)
            setToast({
                isError: true,
                show: true,
                message:
                    'Unable to access camera and microphone. Please check your device settings and browser permissions.',
            })
        }
    }

    setupMedia()
}, [setAuthData, setToast, lang])

解决办法

1. 确认HTTPS环境

iPhone所有现代浏览器要求必须在HTTPS环境下调用媒体设备(localhost开发环境除外),如果生产环境是HTTP,直接会被阻止权限请求。

2. 修复facingMode兼容性

部分iPhone浏览器对facingMode: 'user'的强制配置支持不佳,建议改为ideal优先级,或先简化配置测试基础功能:

// 兼容写法
video: {
    facingMode: { ideal: 'user' },
    width: { ideal: 640 },
    height: { ideal: 480 }
}

// 最简测试写法
video: true,
audio: true

3. 替换不兼容的视频格式

iOS设备几乎不支持video/webm格式,MediaRecorder.isTypeSupported('video/webm')会返回false,导致代码提前终止。建议替换为iOS支持的格式:

// 优先选择iOS兼容格式
const supportedMimeType = MediaRecorder.isTypeSupported('video/mp4') 
    ? 'video/mp4' 
    : MediaRecorder.isTypeSupported('video/quicktime') 
        ? 'video/quicktime' 
        : 'video/webm';

if (!supportedMimeType) {
    console.warn('无支持的视频录制格式');
    return;
}

// 初始化MediaRecorder时使用兼容格式
mediaRecorderRef.current = new MediaRecorder(mediaStream, {
    mimeType: supportedMimeType,
})

// dataavailable事件同步修改Blob格式
const blob = new Blob([event.data], { type: supportedMimeType })

4. 由用户交互触发权限请求

iOS浏览器禁止自动触发媒体权限申请,必须通过用户主动交互(如点击按钮)调用setupMedia,不能在组件挂载时自动执行:

// 定义触发函数
const handleStart = () => {
    setupMedia();
}

// 页面添加触发按钮
<button onClick={handleStart}>开启摄像头和麦克风</button>

5. 检查系统权限设置

确认iPhone系统设置中,对应浏览器已被授予摄像头和麦克风权限:

  • 打开「设置」→ 找到目标浏览器(如Safari/Chrome)→ 开启「摄像头」和「麦克风」权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:05:15