React使用navigator调用摄像头完成拍照功能

本文介绍了如何在React应用中使用navigator.mediaDevices.getUserMediaAPI获取用户的音频和视频设备权限,包括处理成功和错误情况,以及如何将视频流转换为图片并保存到本地。
摘要由CSDN通过智能技术生成

navigator.mediaDevices.getUserMedia 是一个 JavaScript API,用于获取用户的音频和视频设备(如摄像头和麦克风)的访问权限。这个 API 返回一个 Promise 对象,当用户授权访问设备时,Promise 会解析为一个包含音频和视频流的对象。

import React, { useEffect, useRef, useState } from 'react'

export default function PaiZhao() {

    const cameraVideoRef = useRef(null);
    const cameraCanvasRef = useRef(null);
    const [Img, setImg] = useState("")

    useEffect(() => {
        openMedia() //打开摄像头
    }, [])

    function successFunc(mediaStream) {
        const video = cameraVideoRef.current;
        // const video = document.getElementById('cameraVideo') as HTMLVideoElement;
        // 旧的浏览器可能没有srcObject
        if ('srcObject' in video) {
            video.srcObject = mediaStream;
        }
        video.onloadedmetadata = () => {
            video.play();
        };
    }

    function errorFunc(err) {
        console.log(`${err.name}: ${err.message}`);
        // always check for errors at the end.
    }

    // 启动摄像头
    const openMedia = () => { // 打开摄像头
        const opt = {
            audio: false,
            video: {
                width: 200,
                height: 200
            }
        };
        navigator.mediaDevices.getUserMedia(opt).then(successFunc).catch(errorFunc);
    };
    // 关闭摄像头
    const closeMedia = () => {
        const video = cameraVideoRef.current;
        const stream = video.srcObject;
        if ('getTracks' in stream) {
            const tracks = stream.getTracks();
            tracks.forEach(track => {
                track.stop();
            });
        }
    };

    const getImg = () => { // 获取图片资源
        const video = cameraVideoRef.current;
        const canvas = cameraCanvasRef.current;
        if (canvas == null) {
            return;
        }
        const ctx = canvas.getContext('2d');
        ctx.drawImage(video, 10, 0, 300, 150); // 把视频中的一帧在canvas画布里面绘制出来
        const imgStr = canvas.toDataURL(); // 将图片资源转成字符串
        const base64Img = imgStr.split(';base64,').pop(); // 将图片资源转成base64格式
        const imgData = {
            base64Img
        };
        closeMedia(); // 获取到图片之后可以自动关闭摄像头
        return imgData;
    };


    const saveImg = () => { // 保存到本地
        const data = getImg();
        setImg('data:image/png;base64,' + data.base64Img)
    };


    return (
        <div>
            <div className='PaiZhao'>
                <video
                    id="cameraVideo"
                    ref={cameraVideoRef}
                    className='PaiZhao_video'
                />
            </div>
            <div className='PaiZhao'>
                <canvas
                    id="cameraCanvas"
                    ref={cameraCanvasRef}
                    className='PaiZhao_canvas'
                />
            </div>

            <img id="imgTag" src={Img} alt="imgTag" /> 
            <button onClick={() => {
                saveImg()
                closeMedia()
            }} >保存</button>
            <button onClick={() => { closeMedia() }} >关闭摄像头</button>
        </div>
    )
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Umi H5中调用摄像头,您可以使用HTML5中的`getUserMedia()` API。下面是一些步骤,可以帮助您实现这一点: 1. 在您的React组件中,创建一个ref,用于引用video元素: ``` import React, { useRef } from 'react'; function Camera() { const videoRef = useRef(null); return ( <div> <video ref={videoRef} /> </div> ); } export default Camera; ``` 2. 在组件的`componentDidMount()`生命周期方法中,使用`getUserMedia()`方法请求访问用户的摄像头。在请求的promise被resolve时,将摄像头视频流赋值给video元素: ``` import React, { useRef, useEffect } from 'react'; function Camera() { const videoRef = useRef(null); useEffect(() => { navigator.mediaDevices.getUserMedia({ video: true }) .then((stream) => { if (videoRef.current) { videoRef.current.srcObject = stream; } }) .catch((err) => { console.log('Error accessing camera:', err); }); }, []); return ( <div> <video ref={videoRef} /> </div> ); } export default Camera; ``` 3. 在组件的`componentWillUnmount()`生命周期方法中,停止摄像头视频流: ``` import React, { useRef, useEffect } from 'react'; function Camera() { const videoRef = useRef(null); let stream = null; useEffect(() => { navigator.mediaDevices.getUserMedia({ video: true }) .then((videoStream) => { if (videoRef.current) { videoRef.current.srcObject = videoStream; stream = videoStream; } }) .catch((err) => { console.log('Error accessing camera:', err); }); return () => { if (stream) { stream.getTracks().forEach((track) => { track.stop(); }); } }; }, []); return ( <div> <video ref={videoRef} /> </div> ); } export default Camera; ``` 这些步骤可以让您在React Umi H5应用程序中调用摄像头。但是请注意,`getUserMedia()` API不是所有浏览器都支持的。在使用之前,请先检查特定浏览器的支持情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值