react-webcam vs react-html5-camera-photo
React Camera Libraries Comparison
1 Year
react-webcamreact-html5-camera-photo
What's React Camera Libraries?

React camera libraries provide developers with tools to easily integrate camera functionalities into their applications. They allow users to capture photos and videos directly from their devices, enhancing user interaction and experience. These libraries abstract the complexities of accessing device cameras, providing a straightforward API for developers to work with. They are particularly useful in applications requiring user-generated content, such as social media apps, e-commerce platforms, and any app that benefits from real-time media capture.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-webcam382,9361,710168 kB67a year agoMIT
react-html5-camera-photo15,358214246 kB14-MIT
Feature Comparison: react-webcam vs react-html5-camera-photo

Photo Capture

  • react-webcam:

    react-webcam offers robust support for capturing both photos and videos. It allows developers to take snapshots from the video stream, providing more flexibility for applications that require both image and video functionalities.

  • react-html5-camera-photo:

    react-html5-camera-photo specializes in providing a simple interface for capturing still images from the user's camera. It is designed to be lightweight and easy to integrate, making it an excellent choice for applications that primarily need photo functionality without additional overhead.

Video Support

  • react-webcam:

    react-webcam excels in video support, allowing developers to stream video from the camera and capture video clips. This makes it ideal for applications that require real-time video interaction or recording.

  • react-html5-camera-photo:

    react-html5-camera-photo does not support video capture, focusing solely on still image functionality. This makes it less suitable for applications that need video features.

Ease of Use

  • react-webcam:

    react-webcam offers a more comprehensive API that may require a slightly steeper learning curve due to its additional features. However, it remains user-friendly and provides extensive documentation to help developers navigate its functionalities.

  • react-html5-camera-photo:

    react-html5-camera-photo is designed for simplicity and ease of use. It provides a straightforward API that allows developers to quickly implement photo capture with minimal setup, making it accessible for beginners and efficient for experienced developers.

Customization Options

  • react-webcam:

    react-webcam provides a variety of customization options, allowing developers to manipulate the video feed, apply filters, and adjust settings. This makes it a better choice for applications that require a tailored camera experience.

  • react-html5-camera-photo:

    react-html5-camera-photo offers limited customization options, focusing on core functionalities for photo capture. It is suitable for applications that do not require extensive customization of the camera interface.

Community and Support

  • react-webcam:

    react-webcam has a larger community and more extensive documentation, providing a wealth of resources for troubleshooting and implementation. This can be beneficial for developers seeking support and examples.

  • react-html5-camera-photo:

    react-html5-camera-photo has a smaller community compared to react-webcam, which may result in fewer resources and community support. However, it is still actively maintained and has a straightforward implementation process.

How to Choose: react-webcam vs react-html5-camera-photo
  • react-webcam:

    Choose react-webcam if you require a more versatile solution that supports both photo and video capture. It offers additional features like video streaming and the ability to manipulate the video feed, making it ideal for applications that need real-time video processing or effects.

  • react-html5-camera-photo:

    Choose react-html5-camera-photo if you need a lightweight solution focused on capturing photos directly from the camera with minimal configuration. It is suitable for applications that require basic photo capture functionality without the need for extensive video support.

README for react-webcam

react-webcam

Build Status downloads

DEMO: https://codepen.io/mozmorris/pen/JLZdoP

https://www.npmjs.com/package/react-webcam

Webcam component for React. See http://caniuse.com/#feat=stream for browser compatibility.

Note: Browsers will throw an error if the page is loaded from insecure origin. I.e. Use https.

Installation

# with npm
npm install react-webcam

# with yarn
yarn add react-webcam

Demo

https://codepen.io/mozmorris/pen/JLZdoP

Usage

import React from "react";
import Webcam from "react-webcam";

const WebcamComponent = () => <Webcam />;

Props

The props here are specific to this component but one can pass any prop to the underlying video tag eg className, style, muted, etc

| prop | type | default | notes | |---------------------------|----------|--------------|-----------------------------------------------------------------------------------------| | audio | boolean | false | enable/disable audio | | audioConstraints | object | | MediaStreamConstraint(s) for the audio | | disablePictureInPicture | boolean | false | disable Picture-in-Picture | | forceScreenshotSourceSize | boolean | false | uses size of underlying source video stream (and thus ignores other size related props) | | imageSmoothing | boolean | true | pixel smoothing of the screenshot taken | | mirrored | boolean | false | show camera preview and get the screenshot mirrored | | minScreenshotHeight | number | | min height of screenshot | | minScreenshotWidth | number | | min width of screenshot | | onUserMedia | function | noop | callback for when component receives a media stream | | onUserMediaError | function | noop | callback for when component can't receive a media stream with MediaStreamError param | | screenshotFormat | string | 'image/webp' | format of screenshot | | screenshotQuality | number | 0.92 | quality of screenshot(0 to 1) | | videoConstraints | object | | MediaStreamConstraints(s) for the video |

Methods

getScreenshot - Returns a base64 encoded string of the current webcam image. Example:

https://codepen.io/mozmorris/pen/gOOoqpw

You may also pass in an optional dimensions object:

getScreenshot({width: 1920, height: 1080});

The Constraints

We can build a constraints object by passing it to the videoConstraints prop. This gets passed into getUserMedia method. Please take a look at the MDN docs to get an understanding how this works.

https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia https://developer.mozilla.org/en-US/docs/Web/API/Media_Streams_API/Constraints

As an example take a look at this CodePen demo https://codepen.io/mozmorris/pen/GRpEQwK?editors=0010 which shows how to build a custom aspect ratio for the video.

Screenshot (via render props)

const videoConstraints = {
  width: 1280,
  height: 720,
  facingMode: "user"
};

const WebcamCapture = () => (
  <Webcam
    audio={false}
    height={720}
    screenshotFormat="image/jpeg"
    width={1280}
    videoConstraints={videoConstraints}
  >
    {({ getScreenshot }) => (
      <button
        onClick={() => {
          const imageSrc = getScreenshot()
        }}
      >
        Capture photo
      </button>
    )}
  </Webcam>
);

Screenshot (via ref)

const videoConstraints = {
  width: 1280,
  height: 720,
  facingMode: "user"
};

const WebcamCapture = () => {
  const webcamRef = React.useRef(null);
  const capture = React.useCallback(
    () => {
      const imageSrc = webcamRef.current.getScreenshot();
    },
    [webcamRef]
  );
  return (
    <>
      <Webcam
        audio={false}
        height={720}
        ref={webcamRef}
        screenshotFormat="image/jpeg"
        width={1280}
        videoConstraints={videoConstraints}
      />
      <button onClick={capture}>Capture photo</button>
    </>
  );
};

Capturing video

It is posible to capture video with <Webcam /> using the MediaStream Recording API.

You can find an example https://codepen.io/mozmorris/pen/yLYKzyp?editors=0010.

Choosing a camera

User/Selfie/forward facing camera

class WebcamCapture extends React.Component {
  render() {
    const videoConstraints = {
      facingMode: "user"
    };

    return <Webcam videoConstraints={videoConstraints} />;
  }
}

Environment/Facing-Out camera

class WebcamCapture extends React.Component {
  render() {
    const videoConstraints = {
      facingMode: { exact: "environment" }
    };

    return <Webcam videoConstraints={videoConstraints} />;
  }
}

For more information on facingMode, please see the MDN web docs https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode

Show all cameras by deviceId

const WebcamCapture = () => {
  const [deviceId, setDeviceId] = React.useState({});
  const [devices, setDevices] = React.useState([]);

  const handleDevices = React.useCallback(
    mediaDevices =>
      setDevices(mediaDevices.filter(({ kind }) => kind === "videoinput")),
    [setDevices]
  );

  React.useEffect(
    () => {
      navigator.mediaDevices.enumerateDevices().then(handleDevices);
    },
    [handleDevices]
  );

  return (
    <>
      {devices.map((device, key) => (
          <div>
            <Webcam audio={false} videoConstraints={{ deviceId: device.deviceId }} />
            {device.label || `Device ${key + 1}`}
          </div>

        ))}
    </>
  );
};

Recording a stream

https://codepen.io/mozmorris/pen/yLYKzyp?editors=0011

Using within an iframe

The Webcam component will fail to load when used inside a cross-origin iframe in newer version of Chrome (> 64). In order to overcome this security restriction a special allow attribute needs to be added to the iframe tag specifying microphone and camera as the required permissions like in the below example:

<iframe src="https://my-website.com/page-with-webcam" allow="camera; microphone;"/>

Mirrored video but non-mirrored screenshot

Add mirrored prop to the component will make the video and the screenshot be mirrored, but sometimes you need to show a mirrored video but take a non-mirrored screenshot, to accomplish that, you just need to add this CSS to your project:

video {
  transform: scaleX(-1);
}

You can find an example at https://codepen.io/mozmorris/pen/oNygXwz?editors=0110.

License

MIT