9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CrunchtimerAdvent Calendar 2020

Day 24

getUserMediaを使ってローカルでwebカメラの映像をブラウザに表示させる

Last updated at Posted at 2020-12-24

##はじめに
getUserMediaを使ってwebカメラの映像をブラウザに表示させる機会があったので今回、復習として記事を書いていこうと思います

##環境

  • react v17.0.1
  • next v10.0.3

##getUserMdeia

getUserMedia()は、ユーザーのWebカメラやマイクの「メディアストリーム」を取得するメソッドです。

引数では、「audio」(音声)と「video」(動画)の有効・無効を指定できます。


const mediaStream = await navigator.mediaDevices
  .getUserMedia({
    audio: true,
    video: true
  })

true・falseの代わりに「制約」を指定することもできます。
以下は、カメラの解像度を取得する例になります。


const mediaStream = await navigator.mediaDevices
  .getUserMedia({
    audio: false,
    video: {
      width:600,
      height:400 
    }
  })

##実際に使ってみる



import React, { useEffect, useRef, useState } from "react";
import { CameraOnOfButton } from "~/components/Button/Camera";
import { MicOnOfButton } from "~/components/Button/Mic";

//audioのbooleanとvideoの大きさをpropsで渡す
type MediaProps = {
  audio: boolean;
  video: {
    width: number;
    height: number;
  };
};


const WebCameraTest: React.FC<MediaProps> = ({ audio, video }) => {
  const constraints = {
    audio: false,
    video: {
      width: video.width,
      height: video.height,
    },
  };

  const videoRef = useRef<HTMLVideoElement>(null);
//カメラとマイクのon/offボタンのstateを管理
  const [mutedState, setMutedState] = useState(false);
  const micSetter = (isChecked: boolean) => setMutedState(isChecked);
  const [cameraState, setCameraState] = useState(false);
  const cameraSetter = (isChecked: boolean) => setCameraState(isChecked);

//画面がロードされたタイミングでwebカメラに接続
  useEffect(() => {
    navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
      videoRef.current!.srcObject = stream;
    });
  }, []);


//カメラのon/offボタンの実装
  useEffect(() => {
    navigator.mediaDevices
      .getUserMedia({ audio: true, video: true })
      .then((stream) => {
        videoRef.current!.srcObject = cameraState ? null : stream;
      });
  }, [cameraState]);

//マイクのon/offボタンの実装
  useEffect(() => {
    navigator.mediaDevices
      .getUserMedia({ audio: mutedState ? false : true, video: true })
      .then(() => {});
    console.log(audio);
  }, [mutedState]);

  return (
    <>
      <video
        ref={videoRef}
        id="local-video"
        autoPlay
        playsInline
        muted
        width={video.width}
        height={video.height}
      />
      <br />
      <CameraOnOfButton muted={cameraState} setter={cameraSetter} />
      <MicOnOfButton muted={mutedState} setter={micSetter} />
    </>
  );
};

export default WebCameraTest;

カメラとマイクボタンのコンポーネント↓


import React from "react";
import styled from "styled-components";

type Props = {
  muted: boolean;
  setter: any;
};

//styled-componentを使いbuttonのoutlineを0に
const Button = styled.button`
  &:focus {
    outline: 0;
  }
`;

export const MicOnOfButton: React.FC<Props> = ({ muted, setter }) => {
  let icon;
  if (muted) {
    icon = (
     //使いたいアイコン(offの時)
    );
  } else {
    icon = (
     //使いたいアイコン(onの時)
  }
  const handleOnClick = () => {
    setter(!muted);
  };
  return <Button onClick={handleOnClick}>{icon}</Button>;
};

video要素はautoplayを有効にしておくか、もしくはplay()メソッドで再生させることができます。

そしてカメラのデータ(stream)をvideo要素のsrcObjectに代入することで表示することができます。

とりあえずこれでvideo要素にWebカメラの映像を表示することができました。

videoタグの属性には他にも色々あるのでお好みで設定してみてください↓
video: 動画埋め込み要素

##最後に

他にもMediaStreamは様々なプロパティやメソッドを持っており、カメラの解像度やノイズ抑制、明るさ、ズームといった様々な機能を実装することができると思うのでこれから勉強していきたいと思います

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?