web 摄像头获取与使用切换

3,985 阅读1分钟

获取摄像头设备列表

const getVideoList = () => {
    return new Promise((resolve, reject) => {
        navigator.mediaDevices.enumerateDevices().then((devices) => {
            /**
            * device数据类型
            * deviceId: 设备ID
            * kind: 设备类型 videoinput 摄像头, audioinput 扬声器
            * label: 设备名
            */
            const videoList = devices.filter(device => device.kind === "videoinput");
            resolve(videoList);
        }).catch((err) => {
            reject(err);
        });
    });
};

使用切换摄像头设备

<video id="video"></video>
const video = document.getElementById("video");
let currentStream = "";
// 这里注意,deviceId传入时与video audio参数平级的话,也可以启动成功,但是这样,切换设备时就会失败,没有效果,所以deviceId要传在video下面
navigator.mediaDevices
    .getUserMedia({
        audio: false,
        video: {
            width: { min: 1280, ideal: 1920, max: 2560 },
            // min 最低分辨率 ideal 理想分辨率 max 最高分辨率
            height: { min: 720, ideal: 1080, max: 1440 },
            deviceId: "" // 多个摄像头切换,传入摄像头的deviceId
        }
    })
    .then((stream) => {
        if (currentStream) {
            // 先关闭之前已经打开的设备
            currentStream.getTracks().forEach((track) => {
                track.stop();
            });
        }
        
        try {
            currentStream = stream;
            video.srcObject = stream;
        } catch (error) {
            video.src = window.URL.createObjectURL(stream); // 老的播放方式
        }
    })
    .catch((err) => {
        console.error("开启摄像头失败,请尝试重新检测");
    });

切换摄像头只要重新调用方法,传入切换的摄像头设备ID就可以了,这里切换前,先关闭原先的摄像头。