Use Simple Camera is a production-ready, zero-dependency React hook library for comprehensive camera and media handling. It provides a robust set of hooks for video recording, local/remote storage, computer vision (barcodes, motion detection), and hardware controls (zoom, flash, pan, tilt).
- πΈ Easy Camera Access: Simple API to get camera stream, switch cameras, and capture images.
- π₯ Video Recording: Record video/audio blobs with
MediaRecorderAPI. - πΎ Storage: Save recordings to IndexedDB or upload via XHR/S3.
- π Computer Vision: Built-in hooks for Barcode detection and Motion detection.
- π Hardware Controls: Control Zoom, Flash, Pan, and Tilt if supported.
- π Audio Utilities: Monitor microphone volume levels in real-time.
- π± Orientation: Detect device orientation for responsive UI.
- π² Tree Shakeable: Import only the hooks you need.
npm install /use-simple-camera
# or
pnpm add /use-simple-camera
# or
yarn add /use-simple-cameraThe useSimpleCamera hook is the entry point that composes most features, but you can use individual hooks as standalone primitives.
import { useSimpleCamera } from "/use-simple-camera";
const App = () => {
const { stream, ref, error, startCamera, captureImage } = useSimpleCamera();
if (error) return <p>Error: {error.message}</p>;
return (
<div>
<video ref={ref} autoPlay muted playsInline />
<button onClick={() => captureImage()}>Take Photo</button>
</div>
);
};The main hook for managing camera lifecycle, permissions, and stream state.
| Property | Type | Description |
|---|---|---|
stream |
MediaStream | null |
The active camera stream. |
startCamera |
(constraints?) => Promise |
Manually starts the camera. |
stopCamera |
() => void |
Stops all tracks and releases camera. |
captureImage |
(options?) => string |
Captures a base64 image. |
error |
CameraError | null |
Typed error object if something fails. |
isCameraActive |
boolean |
True if stream is active. |
switchCamera |
() => void |
Toggles between front and back cameras. |
Handles video and audio recording with support for separate streams and callbacks.
import { useRecorder } from "use-simple-camera";
const { startRecording, stopRecording, isRecording } = useRecorder(stream);| Property | Type | Description |
|---|---|---|
startRecording |
(options?) => void |
Starts recording media. Options: mode, onComplete. |
stopRecording |
() => void |
Stops recording and triggers onComplete with blob. |
takeSnapshot |
() => Promise<Blob> |
Captures a high-res still photo. |
Manage local persistence (IndexedDB) and remote uploads (S3/XHR).
import { useStorage } from "use-simple-camera";
const { saveToLocal, uploadToRemote } = useStorage();| Property | Type | Description |
|---|---|---|
saveToLocal |
(blob, name, opts) => Promise |
Save blob to IndexedDB with optional retention. |
getFromLocal |
(name) => Promise<Blob> |
Retrieve blob from IndexedDB. |
uploadToRemote |
(blob, opts) => Promise |
Upload to signed URL. Options: headers, timeout, etc. |
Control hardware features like Zoom, Flash, Pan, and Tilt.
import { useCameraControls } from "use-simple-camera";
const { zoom, setZoom, flash, setFlash, supports } = useCameraControls(stream);Detects QR codes and Barcodes in real-time.
const { barcodes, isScanning } = useBarcodeScanner(stream, { formats: ['qr_code'] });Detects movement in the video feed using pixel differencing.
const { motionDetected } = useMotionDetection(stream, { threshold: 10 });Monitors real-time microphone volume.
const { volume } = useAudioLevel(stream); // 0-100Tracks device screen orientation.
const { orientation, angle } = useOrientation(); // 'portrait' | 'landscape'Enumerates available audio and video inputs.
const { videoDevices, audioDevices } = useMediaDevices();Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.