Camera Stream
Live MJPEG camera stream viewable in a browser via the GhostESP web interface
On this page
GhostESP can serve a live camera stream over HTTP, viewable directly in a web browser at http://ghostesp.local/camera. The stream uses MJPEG multipart encoding for low-latency live video.
Supported Boards
- Seeed Studio XIAO ESP32-S3 Sense (
xiao_esp32s3_sense) - enablesCONFIG_HAS_CAMERAand provides the MJPEG stream and motion detector described here. - Requires
CONFIG_HAS_CAMERAand 8 MB PSRAM for best results.
The CrowPanel Advanced P4 builds also ship a separate native camera app (CONFIG_CROWPANEL_P4_CAMERA); this page covers the S3 Sense streaming and motion-detector features.
Quality
Unlike the motion detector (which uses QQVGA grayscale at 160x120), the camera stream uses:
- JPEG pixel format (hardware-encoded by the OV3660 sensor)
- SVGA (800x600) default resolution
- Quality 80 JPEG compression
- 2 frame buffers in PSRAM for smooth double-buffered capture
- Sensor tuned with slight contrast and sharpness boost
Resolution and quality can be changed at runtime without restarting the stream.
Quick Start
From the Web Interface
Open a browser connected to the GhostESP access point and navigate to:
http://ghostesp.local/camera
The page will auto-start the stream when loaded. Use the controls at the bottom to adjust quality, resolution, FPS, and stop/start the stream.
From the CLI
camerastream start
Then open http://ghostesp.local/camera or connect directly to the raw MJPEG stream at http://ghostesp.local/camera/stream.
Stop the stream with:
camerastream stop
Web Controls
The camera page at /camera includes inline controls:
- Quality slider (10-100) - adjusts JPEG compression quality in real time
- Resolution dropdown - switch between QQVGA, QVGA, VGA, SVGA, XGA, SXGA, and UXGA
- FPS selector - set target framerate (5-30 fps)
- Stop / Start buttons - toggle the stream on and off
Controls send commands through the /camera/api endpoint, which is restricted to camera commands only.
CLI Commands
camerastream start- Initialize camera and enable streaming.camerastream stop- Stop streaming and release the camera.camerastream status- Show current state (running, quality, resolution, FPS, PSRAM, client count, frames served).camerastream quality <1-100>- Set JPEG quality.camerastream resolution <name>- Set resolution (see below).camerastream fps <1-30>- Set target framerate.
Available Resolutions
| Name | Resolution |
|---|---|
| QQVGA | 160x120 |
| QVGA | 320x240 |
| VGA | 640x480 |
| SVGA | 800x600 |
| XGA | 1024x768 |
| SXGA | 1280x1024 |
| UXGA | 1600x1200 |
Higher resolutions produce larger frames and lower framerates. SVGA is a good default; UXGA works on the XIAO Sense with its 8 MB PSRAM but will be slower.
Interaction with Motion Detector
The camera stream and motion detector share the same camera hardware and cannot run simultaneously:
- Starting the camera stream will automatically stop the motion detector.
- Starting the motion detector will automatically stop the camera stream.
- Whichever feature was started last takes ownership of the camera.
Troubleshooting
- “Stream Unavailable” in browser - The stream hasn’t started yet. The page auto-starts it, but if it fails, try
camerastream startfrom the CLI. - “Stream busy - another client is connected” - Only one client can view the stream at a time. Close the other tab or browser.
- Camera init failed - Check the camera ribbon cable connection on the XIAO Sense.
- Low framerate at high resolutions - Drop to VGA or SVGA for smoother streaming. UXGA is bandwidth-heavy.
- Stream disconnects after a while - The HTTP server has send timeouts; the page will auto-reconnect after 3 seconds.
