You were told to wait for an emailed configuration file before the camera would stream, and the email never arrives. In most cases there is nothing to arrive: a camera that follows the USB Video Class (UVC) standard enumerates with the driver already built into Windows and Linux, and streams from any capture program with no vendor file of any kind. This guide is for integrators and developers stuck at that step. In ten minutes you can confirm whether a device is UVC, bring up a live frame on either operating system, put numbers on the bandwidth your format needs, and recognise the three cases where a file or kernel setting genuinely is required.
The symptom, and the causes ranked by probability
The stall looks the same every time: someone promises a configuration or driver file by email, nothing arrives, and no demo will run. Work down this list; the first cause covers most of these threads.
- No file exists. A class-compliant UVC camera needs no vendor configuration file, driver download or licence key. The expectation, not the camera, is the fault. Test: run the two-minute check below. This is the cause in the clear majority of missing-file cases.
- The device is not UVC. A bridge chip running a proprietary protocol shows a vendor-specific USB class, and no email can turn it into a webcam. Test: lsusb -v shows bInterfaceClass 255 and no video node appears. Fix: install the maker's SDK, obtained from the maker or its distributor.
- Format negotiation fails. The camera enumerates but the program asks for a pixel format, resolution or frame interval the camera never advertised. Test: compare what the code requests against the device's own format list, shown below. Fix: pin the code to a listed format.
- The host blocks access. An embedded kernel may ship without the UVC driver, or your Linux user may lack permission on the device node. Test: ls /dev/video* comes back empty, or the open call fails with permission denied. Fix: enable the driver in the kernel, or add your user to the group that owns video devices.
- The cable cannot carry the format. Enumeration succeeds, then frames stall or drop. Test: the bandwidth arithmetic in the worked example below. Fix: MJPEG, a lower resolution or frame rate, or a USB 3 port.
The two-minute check: is the device UVC at all
UVC is what makes plug-and-play real for cameras; the guide to what UVC plug-and-play really guarantees covers the contract. The check itself takes minutes:
- Plug the camera into a root port on the host, not through a hub.
- On Linux, run
lsusb -vand look under the video interfaces forbInterfaceClass 14 Video(class code 0x0E) with a Video Control interface and a Video Streaming interface. That pair is the UVC signature. - Run
ls /dev/video*. A UVC camera registers one or two video nodes; if lsusb lists the vendor but no node exists, the kernel lacks the driver or the device is not UVC. - On Windows, open Device Manager. A class-compliant camera appears under Cameras by its own name, loaded by the in-box USB Video Class driver from the device's own USB descriptors, with no vendor INF and no unknown-device entry.
- Read the result. A video node or a Cameras entry means the device is standard UVC and ready to stream. A vendor-specific class means the maker's SDK is the path, and the interface checks to run before committing to a camera module list what else to confirm.
Bring up a frame on Linux
- If the node list came back empty, load the driver:
sudo modprobe uvcvideo. Most distributions load it automatically at plug-in. The in-kernel UVC driver maps the class controls — exposure, gain, white balance, focus — onto standard V4L2 controls, which is why no vendor header file is needed to set them. - List the devices and their formats:
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --list-formats-ext
/dev/video0 here is illustrative; use the node your listing shows. A UVC camera often registers a second node that carries metadata rather than pixels, so trust the format listing, not node numbering.
- Grab one frame in a format the listing showed:
ffmpeg -f v4l2 -input_format mjpeg -video_size 1920x1080 -i /dev/video0 -frames:v 1 frame.jpg
The format and size here are illustrative; substitute values from step 2. Note that the driver selects the frame interval closest to the one requested, so read the interval list rather than assuming the camera runs 30 fps in every format.
- Confirm the result: open frame.jpg and check the resolution matches the request.
If the node exists but the open call fails with permission denied, run groups; add your user to the group that owns video devices and log in again. The Linux device-permission checks for video and media nodes walk the full sequence, and the path-conflict fix for multiple USB cameras keeps two cameras from swapping nodes across replugs.
Bring up a frame on Windows
Windows 10 and 11 load the in-box USB Video Class driver from the descriptors alone: plug in, the camera appears under Cameras, and any Media Foundation or DirectShow program can open it. There is no INF to request and no file to import; a vendor utility, where one exists, adds private controls rather than enabling capture.
Set the format explicitly. The failure mode is precise: the program requests a media type the camera does not advertise, and the open call fails on exactly that property. Match the code to the device's format list; the pixel-format media-type fix for Windows stream setup shows the path.
Frame rate rides inside the format. A camera that lists 1920 × 1080 at 30 fps in MJPEG and a slower interval uncompressed will run at the slower rate if the program leaves the format on auto, so set all three: format, size, interval.
The three cases where a file really is required
Vendor-specific devices. bInterfaceClass 255 with no camera node means a private protocol on top of USB. The maker's SDK, installed from the maker or its distributor, is the legitimate and only route. Depth and structured-light cameras often pair a UVC colour stream with a private depth stream: the colour half streams with no file, while the depth half waits for the SDK.
Embedded kernels without the driver. Board support packages for industrial controllers sometimes ship with the USB Video Class driver disabled. Enable CONFIG_USB_VIDEO_CLASS in the kernel configuration and rebuild; until then no userspace program can create the node. A write-up of the kernel-configuration fix for UVC cameras on industrial Linux shows the path end to end.
Libraries that read through libusb. Vendor libraries for USB3 Vision cameras, and libuvc-based tools, allocate transfer buffers through the kernel's usbfs, which caps them at 16 MB by default; large uncompressed streams stall after a few frames. Raise the cap with the usbcore.usbfs_memory_mb boot parameter — 1000 is a common choice for USB3 streams. The in-kernel UVC driver does not use usbfs this way, so a plain UVC camera is immune. The USB3 Vision tuning guide for usbfs and file limits shows the parameter and the companion file-limit checks.
Bandwidth arithmetic: will the stream fit the cable
Worked example, worst case first: uncompressed YUY2 at 1920 × 1080, 30 fps, 2 bytes per pixel.
- 1920 × 1080 = 2,073,600 pixels per frame
- × 2 B = 4,147,200 B per frame, about 4.15 MB
- × 30 fps = 124,416,000 B/s, about 124 MB/s ≈ 995 Mbps
Set that against the cable. USB 2.0 carries 480 Mbps on the wire, and real camera streams land near 40 MB/s once protocol overhead is paid, so uncompressed HD never fits: 720p30 YUY2 already needs 1280 × 720 × 2 B × 30 = 55.3 MB/s. The same camera in MJPEG at a typical 10:1 compression costs 12.4 MB/s ≈ 100 Mbps for 1080p30, which fits a USB 2.0 port with a second camera alongside at 25 MB/s combined. USB 3.0's 5 Gbps line rate leaves roughly 400 MB/s usable, so the 124 MB/s YUY2 stream fits with two more like it.
| Port | Format that fits | Use it for |
|---|---|---|
| USB 2.0 | MJPEG, or uncompressed below 640 × 480 at 30 fps (18.4 MB/s) | Monitoring, demos |
| USB 3.x | YUY2 up to 1080p30 with margin | Measurement, processing |
Compression matters at the pixel level: MJPEG artifacts land on edges, so a dimensional measurement reading a 0.1 mm edge position will see them; prefer uncompressed on USB 3 for measurement work. When the format cannot move, cut pixels: ROI cropping at the source reduces bandwidth before the host. MJPEG exists precisely because uncompressed HD outruns USB 2.0, and the sensor and bridge choices behind a UVC MJPEG camera show what the class demands of the hardware.
UVC convenience against a USB3 Vision camera
Same connector, different protocol. A USB3 Vision camera is not a UVC device: it never appears under Cameras or as a /dev/video node, and it needs the maker's GenTL producer or SDK. That vendor file is legitimate and expected here — it is the industrial replacement for the emailed file that started this. What it buys: hardware trigger and strobe lines, global shutter across the range, deterministic bandwidth, and firmware built for 24/7 lines.
When the decision is plug-and-play — a demo rig, a monitoring feed, an embedded board on a stock kernel — stay UVC and budget the cable with the arithmetic above. When the decision is triggered inspection, motion or measurement, step to industrial USB3. Compact USB3 modules cover the built-in options without a housing:
- Sensor format
- 1/2.7"
- Lens mount
- C-mount
- Sensor format
- 1/1.8"
- Interface
- USB3
The MV-CB060-10UM-B suits a bare-board build: 6 MP mono on a 1/1.8" rolling-shutter IMX178 sensor over USB3. When motion must freeze rather than smear, the LS-BCM-0003 delivers a 3.1 MP global-shutter image at 120 fps over USB3, with a C-mount for glass.
- Sensor format
- 1/1.8"
- Lens mount
- C-mount
- Interface
- USB3
- Resolution
- 5 MP
On the line, the industrial side trades setup effort for control. The LS-CMR-0166 captures 12 MP at 30 fps over USB3 from a 4000 × 3000 rolling-shutter sensor, with the resolution to cover a wide field in one shot.
- Sensor format
- 1/1.7"
- Interface
- USB3
- Resolution
- 12 MP
- Shutter
- Rolling
Both families sit in the board-level cameras and area scan cameras categories. Before a module goes into a build, run it through the board-camera evaluation checklist for inspection systems, and the embedded-vision selection guide covers the module-level trade-offs.
Checks that keep it streaming
- Pin the pixel format, resolution and frame interval in the capture code; driver defaults change between hosts.
- Save the lsusb -v output and the format listing from the bench unit with the project files; they settle format disputes in minutes.
- Budget bandwidth per cable, not per port: a hub shares one upstream link, and the formula above applies to that link.
- On an embedded target, confirm CONFIG_USB_VIDEO_CLASS is in the kernel before the hardware order, not during commissioning.
- Re-run the format listing after any firmware update; formats and intervals can change.
If the camera choice is still open, the camera finder filters by interface, shutter and resolution, and the camera configurator step turns a camera into a full station. More camera integration and capture troubleshooting sits on the cameras topic page, and the contact page reaches the applications team when a build refuses to cooperate.
Questions
How do I check whether a USB camera is UVC before buying it?
Ask for the interface line of the data sheet: a UVC device states USB Video Class compliance or lists UVC among its protocols. On a unit in hand, run lsusb -v and look for bInterfaceClass 14 Video with a Video Streaming interface; on Windows, a class-compliant camera appears under Cameras in Device Manager with no vendor INF. Anything showing a vendor-specific USB class needs the maker's SDK.
Why does my UVC camera create two /dev/video nodes?
The UVC driver registers one node for the pixel stream and one for device metadata, so a single camera can occupy /dev/video0 and /dev/video1. Only the pixel node lists capture formats. Match cameras by stable path or serial in udev rules rather than node order, because replugging or adding a second camera can renumber the nodes and quietly point your code at the metadata node.
Do I need the camera maker's SDK for a UVC device?
Not for capture. Exposure, gain, white balance, focus and zoom travel through the class interface and appear as standard controls in V4L2 or Media Foundation. The maker's SDK earns its place only for vendor-private controls the class does not expose, firmware updates, or depth cameras that stream a custom format alongside the UVC colour stream.
What is the practical streaming limit of a USB 2.0 port?
A USB 2.0 port carries 480 Mbps on the wire, and real camera streams land near 40 MB/s once protocol overhead is paid. That rules out uncompressed HD: 1080p30 in YUY2 needs about 124 MB/s. Use MJPEG, roughly 12 MB/s for 1080p30 at a 10:1 compression, or drop resolution and frame rate until the arithmetic fits.
Can a UVC camera and a USB3 Vision camera share one host controller?
Yes, if you budget both against the controller rather than the port count. A USB 3.0 host delivers roughly 400 MB/s usable, so a 124 MB/s YUY2 stream and a USB3 Vision camera at a similar rate fit together. Put each on its own root port: a hub shares one upstream link, and the bandwidth arithmetic applies per link.



