React hook中调用摄像头 实现拍照 录制

import {useEffect,useState} from 'react';

export default function webrtc() {

  const [mediaStream,setmediaStream]=useState(null);

  const [Stream ,setStream]=useState(false);

  const [videoBlob,setvideoBlob]=useState(null);

  const [mediaRecorder,SetmediaRecorder]=useState(null);

  const [Type,setType]=useState(false)

    useEffect(()=>{

    },[])

      const getUserMediaStream=(constraints, cb)=>{

        let video = document.querySelector('#viodes');

        if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia){

              navigator.mediaDevices.getUserMedia({audio: true, video: { facingMode:Type?"user":"environment" }}).then((stream) => {

                  if ("srcObject" in video) {

                        video.srcObject = stream;

                        video.play();

                        // onluzhis(stream)

                        setStream(stream)

                  } else {

                      video.src = window.URL && window.URL.createObjectURL(stream) || stream;

                      console.log('第二种');

                  }

              })

        } else if (navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {

             // webkit内核浏览器

              if (navigator.mediaDevices === undefined) {

                navigator.mediaDevices = {};

              }

              console.log('我是webkit内核');

        }

     }

     const onClickzp= ()=>{

        const viodes = document.getElementById('viodes')

        const canvas = document.getElementById('canvas')  // canvas元素

        const context = canvas.getContext('2d')

        context.drawImage(viodes, 0, 0) // 将video在canvas上绘制出来

        canvas.toBlob(blob => {   // 将canvas转换为blob

            console.log(blob)

        })

     }

    const updateVideo=(ctx, video , rate)=>{

      ctx.drawImage(video, 0, 0, 600, 600*rate);// 使用视频帧(当前帧)绘制canvas

      video.requestVideoFrameCallback( updateVideo );

   }

const onluzhis= ()=>{

        let options = {

          audioBitsPerSecond: 128000,

          videoBitsPerSecond: 2500000,

          mimeType: "video/webm;codecs=vp8,opus"//webm类型一定要加codecs=vp8,opus,否则会导致录制时候时而可以用时而不能用

      }

      let recorder = new MediaRecorder(Stream,options);

        SetmediaRecorder(recorder)

        recorder.ondataavailable = function(evt) {

            window.bobals = new Blob([evt.data], { type: evt.data.type });

              // setvideoBlob(bobal)

          }

          recorder.start();

          console.log('开始录制');

}

const endsTartOnload = ()=>{

     mediaRecorder.stop();

     setTimeout(function(){

      console.log("录像上传",window.bobals);

      let blob = new Blob([window.bobals]);

      let downloadElement = document.createElement("a");

      let href = window.URL.createObjectURL(blob); //创建下载的链接

      downloadElement.href = href;

       downloadElement.download =  formatDateTime(new Date())+'.webm'; //下载后文件名

      document.body.appendChild(downloadElement);

      downloadElement.click(); //点击下载

      document.body.removeChild(downloadElement); //下载完成移除元素

      window.URL.revokeObjectURL(href); //释放掉blob对象

    },1000);

}

let formatDateTime = function (date) {

        var y = date.getFullYear();

        var m = date.getMonth() + 1;//注意这个“+1”

        m = m < 10 ? ('0' + m) : m;

        var d = date.getDate();

        d = d < 10 ? ('0' + d) : d;

        var h = date.getHours();

        h=h < 10 ? ('0' + h) : h;

        var minute = date.getMinutes();

        minute = minute < 10 ? ('0' + minute) : minute;

        var second=date.getSeconds();

        second=second < 10 ? ('0' + second) : second;

        return y+'-'+m+'-'+d+' '+h+':'+minute+':'+second;

};

const qiehuan=()=>{

    setType(!Type)

    stopCapture()

}

const stopCapture=()=>{

  var video = document.getElementById('viodes');

  if (!video.srcObject) return

  let stream = video.srcObject

  let tracks = stream.getTracks();

  tracks.forEach(track => {

      track.stop()

      getUserMediaStream()

  })

}

  return (

    <div className='webrtc'>

        <div className='tops'>

            <video  id='viodes'></video>

            <canvas id="canvas"></canvas>

        </div>

        <div>当前摄像头:{Type?'前置':'后置'}</div>

          <div className='buttons'>

            <button onClick={getUserMediaStream}>获取摄像头</button>

            <button onClick={onClickzp}>点击抓拍</button>

            <button onClick={onluzhis}>点击录制</button>

            <button onClick={endsTartOnload}>结束录制并且下载视频</button>

            <button   onClick={qiehuan}>切换摄像头</button>

          </div>

    </div>

  )

}

React项目中实现摄像头拍照功能可以使用React Webcam库。该库提供了一个React组件,可以方便地调用摄像头拍照。以下是实现摄像头拍照功能的步骤: 1. 首先,安装React Webcam库。可以使用npm或yarn命令进行安装。 2. 在需要使用摄像头拍照功能的组件中,引入React Webcam库,并使用Webcam组件来渲染摄像头视图。 3. 在组件中创建一个ref来引用Webcam组件。 4. 在渲染的组件中,将摄像头视图渲染到页面上。可以使用video标签来显示摄像头视图,并通过ref将其与Webcam组件关联起来。 5. 添加拍照的事件处理函数。可以在组件中定义一个函数,当点击拍照按钮时调用该函数。在函数中,使用ref获取到Webcam组件,并调用拍照的方法。 6.拍照完成后,可以将拍摄到的照片保存下来,或者将其显示在页面上。 下面是一个示例代码,演示了如何在React项目中使用React Webcam库来实现摄像头拍照功能: ```jsx import React, { useRef } from 'react'; import Webcam from 'react-webcam'; const CameraComponent = () => { const webcamRef = useRef(null); const capture = () => { const imageSrc = webcamRef.current.getScreenshot(); // 在这里可以将拍摄到的照片进行保存或显示 }; return ( <div> <Webcam audio={false} ref={webcamRef} screenshotFormat="image/jpeg" /> <button onClick={capture}>拍照</button> </div> ); }; export default CameraComponent; ``` 在上面的代码中,我们创建了一个CameraComponent组件,其中包含一个Webcam组件和一个拍照按钮。当点击拍照按钮时,会调用capture函数,并通过webcamRef获取到Webcam组件的截图。 这样就实现了在React项目中使用React Webcam库进行摄像头拍照的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [在React项目中实现调用摄像头拍照的功能](https://blog.csdn.net/qq_43399210/article/details/124168383)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [React hook调用摄像头 实现拍照 录制](https://blog.csdn.net/qq_50220483/article/details/124820809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值