Troubleshooting
Camera integration often involves platform quirks or hardware limitations. This guide collects the most common issues observed while developing with libusb-uvc and offers remediation steps.
Permission Errors
Symptom: usb.core.NoBackendError or LIBUSB_ERROR_ACCESS when
calling libusb_uvc.find_uvc_devices().
Resolution: Install an appropriate udev rule matching the camera’s VID/PID
and ensure your user belongs to the plugdev (or distribution equivalent)
group. After applying rules, reload them and replug the camera.
uvcvideo Node Disappears
Symptom: /dev/video0 vanishes after running a streaming script.
Resolution: Libusb-UVC automatically resets the USB device when it
previously detached the kernel driver. If you’ve disabled that behaviour,
re-enable camera.reset_device() on stream teardown or reboot the bus.
Probe/Commit Fails
Symptom: LIBUSB_ERROR_PIPE or LIBUSB_ERROR_TIMEOUT during stream
setup.
Resolution: Inspect the interface with python3 examples/uvc_inspect.py
--verbose. Try lower resolutions, reduce --fps, or request CodecPreference.YUYV.
Some cameras require committing the default frame interval. Double-check that
no other client has claimed the interface.
Dropped or Corrupted Frames
Symptom: Visible artefacts, truncated frames, or frequent warnings in the log output.
Resolution: Isochronous transfers are constrained by USB bandwidth. Move
the camera to a direct root-port, lower the frame size or frame rate, or adjust
the queue_size passed to libusb_uvc.UVCCamera.stream().
Frame-based H.264/H.265 Quirks
Symptom: The device advertises a Frame-based format but decoders report
Invalid data found when processing input or Unsupported codec for conversion.
Cause: UVC 1.5 allows cameras to send H.264/H.265 payloads without repeating the Sequence Parameter Set (SPS) and Picture Parameter Set (PPS) in every frame. Some implementations go further and start streaming P-slices before emitting any SPS/PPS/IDR trio, leaving host decoders without the context they need.
Libusb-UVC behaviour: The library detects Annex B and AVC payload layouts, caches the latest SPS/PPS it receives, and injects them ahead of IDR frames so PyAV and GStreamer can initialise. Frames delivered before the configuration arrives are dropped; as soon as SPS/PPS appear the cached copy is reused for the rest of the session.
Resolution: If the firmware never supplies SPS/PPS (it happens on some cheaper hardware) the stream remains undecodable. You can:
Capture a raw payload with
uvc_capture_frame.py --codec h264 --outputand inspect it withhexdump—look for00 00 00 01 67(SPS) or... 01 65(IDR).Check whether the vendor provides a driver that exposes H.264 Extension Unit controls containing SPS/PPS blobs.
File a bug with the camera vendor; the host cannot reconstruct missing SPS/PPS without reverse-engineering the firmware.
Recording Plays Too Fast/Slow
Symptom: Saved .mkv/.avi files appear to run at 2x speed or crawl when opened in VLC/mpv.
Resolution: The recorder uses presentation timestamps from the camera
payload headers. Some firmwares omit PTS entirely, so Libusb-UVC synthesises
monotonic timestamps from the negotiated FPS. If playback is still off, verify
the stream actually negotiated the expected FPS (look for Stream running at
XX.XX fps in the logs) and lower the requested frame rate to one of the
advertised intervals listed by uvc_inspect.py.
Recording Files Are Empty
Symptom: .mkv/.avi outputs are zero bytes or players report End of file.
Resolution: Some cameras take several seconds to emit the first IDR / key
frame. Let the recorder run for longer (10s+ on the HDMI grabber reference
device) so the pipeline can flush its header. Ensure you requested a decoder
backend (PyAV or GStreamer) and that the relevant dependencies are installed.
MJPEG recordings require either PyAV or the GStreamer fallback; frame-based
codecs require PyAV or GStreamer with the matching h264parse/h265parse
plugins.
Controls Missing or Unnamed
Symptom: UVCControlsManager returns only generic selectors.
Resolution: Add a GUID-keyed quirks JSON file describing the extension
unit selectors under src/libusb_uvc/quirks. The manager merges quirk names,
GET_INFO responses, and descriptor metadata to present human-readable
control names.
VC Interface Busy
Symptom: Attempting to read/write controls raises [Errno 16] Resource busy.
Resolution: The library normally detaches the Video Control (VC) interface
from uvcvideo on demand. If you set the environment variable
LIBUSB_UVC_AUTO_DETACH_VC=0 you must detach the kernel driver manually (or
run as root). Re-enable auto-detach by unsetting the variable or giving it a
truthy value.
Still Capture Returns Empty Payloads
Symptom: uvc_capture_still.py succeeds but the saved file contains only
zeros or fails to decode; uvc_inspect.py --test-still reports len=…
head=00 00 ….
Resolution: This behaviour is unfortunately common—many cameras expose
still-image descriptors without wiring the firmware. Use uvc_inspect.py
--test-still as a quick smoke test whenever you connect a new device; the
command cycles through the first advertised still frame per format and every
published compression index. If every combination fails, assume the camera
requires proprietary commands or OEM software to capture stills.
Further Help
Enable
--log-level DEBUGon examples to capture additional diagnostics.Review the API Reference reference for lower-level helper functions.
File issues with detailed logs and
uvc_inspectoutput when encountering device-specific quirks not covered here.