·building·project·shipped

ESP32-S3 USB Webcam

Firmware that makes a Seeed XIAO ESP32S3 Sense enumerate as a real USB Video Class webcam, with Linux seeing it as a normal /dev/video camera.

  • Turns the XIAO ESP32S3 Sense into a standard USB Video Class device
  • Uses MJPEG frames from the onboard camera over native USB, not Wi-Fi
  • Verified on Linux as 303a:8000 Espressif ESP UVC Device with /dev/video0

Frame captured from the ESP32-S3 USB webcam

This was a small hardware integration project with one strict requirement: the board had to behave like a USB webcam. The useful distinction is that the host operating system should not need a stream URL, access point, password, or custom camera adapter. It should see a UVC device and hand back a normal V4L2 camera node.

The working build targets the Seeed XIAO ESP32S3 Sense. The firmware uses ESP-IDF through PlatformIO, Espressif's camera driver, and a vendored usb_device_uvc component. The camera produces MJPEG frames and the USB stack exposes them through the standard webcam interface.

The main failure mode was also the most tempting one: an ESP32 Wi-Fi camera with an AP and HTTP server. That path is common for older ESP32-CAM boards, but it was the wrong interface. The final repository deliberately removes that whole path and keeps the project UVC-only.

The proof was host-side. Linux enumerated the board as 303a:8000 Espressif ESP UVC Device, created /dev/video0 and /dev/video1, and OpenCV captured a real 640x480 frame from the device.

Repo: JacobFV/esp32-usb-webcam
Build note: public gist