CameraAccess API
Quagga2 exposes a CameraAccess API for direct control of camera functionality. This API provides shortcuts for commonly used camera operations.
Access: Quagga.CameraAccess
Overview
The CameraAccess API allows you to:
- Request and release camera access
- Enumerate available video devices
- Control camera torch (flash)
- Get information about active video streams and tracks
All methods return Promises for async operation handling.
Methods
CameraAccess.request(videoElement, constraints)
Initializes the camera and starts playback.
Parameters:
-
videoElement(HTMLVideoElementnull) - Video element to display camera stream. If null, camera initializes but remains invisible. constraints(MediaTrackConstraints, optional) - Camera selection and configuration constraints.
Returns: Promise<void> - Resolves when camera is ready, rejects on error.
Example:
const video = document.querySelector('#camera-video');
// Request camera with default constraints
await Quagga.CameraAccess.request(video);
// Request specific camera
await Quagga.CameraAccess.request(video, {
facingMode: 'environment', // Back camera on mobile
width: { ideal: 1280 },
height: { ideal: 720 }
});
// Request camera by device ID
const deviceId = 'abc123...';
await Quagga.CameraAccess.request(video, { deviceId });
// Initialize camera without displaying (for probing)
await Quagga.CameraAccess.request(null);
Use cases:
- Start camera before Quagga initialization
- Probe camera availability and permissions
- Initialize camera without displaying video
CameraAccess.release()
Stops the video stream and releases all camera resources.
Returns: Promise<void> - Resolves when all tracks are stopped and resources released.
Example:
// Stop camera
await Quagga.CameraAccess.release();
console.log('Camera released');
Behavior:
- Pauses the video element
- Stops all tracks in the media stream
- Releases camera for use by other applications
Note: Always call release() when finished with the camera to free system resources.
CameraAccess.enumerateVideoDevices(constraints?)
Lists all available video input devices (cameras), optionally filtered by constraints.
Parameters:
constraints(MediaTrackConstraints, optional) - Constraints to filter devices. When provided, only devices that can satisfy the given constraints will be returned.
Returns: Promise<MediaDeviceInfo[]> - Array of video device information.
Example:
// Get all video devices
const devices = await Quagga.CameraAccess.enumerateVideoDevices();
devices.forEach(device => {
console.log('Device:', device.label);
console.log('Device ID:', device.deviceId);
console.log('Group ID:', device.groupId);
});
// Example output:
// Device: Front Camera
// Device ID: abc123...
// Device: Back Camera
// Device ID: def456...
Filtering devices with constraints:
// Get only devices that support a minimum resolution
const hdDevices = await Quagga.CameraAccess.enumerateVideoDevices({
width: { min: 1280 },
height: { min: 720 }
});
// Get only back-facing cameras
const backCameras = await Quagga.CameraAccess.enumerateVideoDevices({
facingMode: 'environment'
});
// Eliminate wide-angle only cameras by specifying aspect ratio
const standardCameras = await Quagga.CameraAccess.enumerateVideoDevices({
aspectRatio: { ideal: 1.777 } // 16:9
});
Use cases:
- Build camera selector UI
- Detect available cameras before initialization
- Check for front/back camera availability on mobile
- Filter out cameras that don’t meet quality requirements
- Eliminate wide-angle cameras that may not be suitable for barcode scanning
Note: Device labels may be empty strings until camera permission is granted. When using constraints, the method will request temporary access to each device to test if it satisfies the constraints.
CameraAccess.getActiveStreamLabel()
Gets the label of the currently active video track.
Returns: string - Label of active video track (e.g., “Back Camera”, “USB Camera”).
Example:
const label = Quagga.CameraAccess.getActiveStreamLabel();
console.log('Using camera:', label);
// Output: "Using camera: Back Camera"
Use cases:
- Display which camera is currently active
- Verify correct camera is being used
- Logging and debugging
CameraAccess.getActiveStream()
Gets the complete MediaStream object for the currently active video.
Returns: MediaStream | null - The active MediaStream object, or null if no camera is active.
Example:
const stream = Quagga.CameraAccess.getActiveStream();
if (stream) {
console.log('Stream ID:', stream.id);
console.log('Stream active:', stream.active);
console.log('Video tracks:', stream.getVideoTracks().length);
console.log('Audio tracks:', stream.getAudioTracks().length);
// Clone the stream
const clonedStream = stream.clone();
}
// Pass stream to WebRTC peer connection
if (stream?.active) {
peerConnection.addStream(stream);
}
Use cases:
- Pass the stream to WebRTC peer connections
- Clone the stream for multiple consumers
- Check if the stream is still active via
stream.active - Access the stream ID
- Work with all tracks (video and audio) in the stream
Note: For accessing just the video track, use getActiveTrack() instead.
CameraAccess.getActiveTrack()
Gets the MediaStreamTrack for the currently active video.
Returns: MediaStreamTrack | null - Active video track object, or null if no camera is active.
Example:
const track = Quagga.CameraAccess.getActiveTrack();
console.log('Track state:', track.readyState);
console.log('Track settings:', track.getSettings());
console.log('Track capabilities:', track.getCapabilities());
// Get current resolution
const settings = track.getSettings();
console.log(`Resolution: ${settings.width}x${settings.height}`);
Use cases:
- Access advanced track capabilities
- Monitor track state
- Apply additional constraints
- Access camera capabilities (zoom, focus, etc.)
CameraAccess.enableTorch()
Turns on the camera torch (flash).
Returns: Promise<void> - Resolves when torch is enabled, rejects on error.
Example:
try {
await Quagga.CameraAccess.enableTorch();
console.log('Torch enabled');
} catch (error) {
console.error('Failed to enable torch:', error);
}
Browser Support:
- ✅ Chrome (Android)
- ✅ Chrome (Desktop with supported cameras)
- ❌ Safari iOS 16.4 and earlier
- ⚠️ Safari iOS later versions - may or may not work
Requirements:
- Camera must support torch capability
- Camera must be actively streaming
- Browser must support torch constraint
Note: Always wrap in try-catch as not all devices support torch.
CameraAccess.disableTorch()
Turns off the camera torch (flash).
Returns: Promise<void> - Resolves when torch is disabled, rejects on error.
Example:
try {
await Quagga.CameraAccess.disableTorch();
console.log('Torch disabled');
} catch (error) {
console.error('Failed to disable torch:', error);
}
Browser Support: Same as enableTorch().
Complete Example
// Enumerate cameras and let user choose
const devices = await Quagga.CameraAccess.enumerateVideoDevices();
const backCamera = devices.find(d => d.label.includes('back'));
// Initialize camera
const video = document.querySelector('#video');
await Quagga.CameraAccess.request(video, {
deviceId: backCamera.deviceId
});
console.log('Active camera:', Quagga.CameraAccess.getActiveStreamLabel());
// Enable torch for better scanning in dark environments
try {
await Quagga.CameraAccess.enableTorch();
} catch (error) {
console.log('Torch not available');
}
// ... use camera for scanning ...
// Cleanup
await Quagga.CameraAccess.disableTorch();
await Quagga.CameraAccess.release();
Torch Control in Live Scanning
For torch control during live scanning, you may want to provide a toggle button:
let torchEnabled = false;
document.querySelector('#torch-toggle').addEventListener('click', async () => {
try {
if (torchEnabled) {
await Quagga.CameraAccess.disableTorch();
torchEnabled = false;
} else {
await Quagga.CameraAccess.enableTorch();
torchEnabled = true;
}
} catch (error) {
console.error('Torch control failed:', error);
alert('Torch not available on this device');
}
});
Advanced Camera Control
For advanced camera control (zoom, focus, etc.), use the MediaStreamTrack API:
const track = Quagga.CameraAccess.getActiveTrack();
const capabilities = track.getCapabilities();
// Check if zoom is supported
if (capabilities.zoom) {
console.log('Zoom range:', capabilities.zoom.min, '-', capabilities.zoom.max);
// Apply zoom
await track.applyConstraints({
advanced: [{ zoom: 2.0 }]
});
}
Read more: MediaStreamTrack Capabilities
Error Handling
Always handle errors when using CameraAccess methods:
try {
await Quagga.CameraAccess.request(video);
} catch (error) {
if (error.name === 'NotAllowedError') {
console.error('Camera permission denied');
} else if (error.name === 'NotFoundError') {
console.error('No camera found');
} else {
console.error('Camera error:', error);
}
}
Related
- Browser Support - Camera compatibility information
- Configuration Reference - Camera configuration in Quagga.init()
- API Documentation - Main Quagga API methods
- Tips & Tricks - Camera optimization tips