Using four webcams on a single computer
The other day over the in the vMix User Group on Facebook Mark Schutte asked the following:
Is there a way to get VMIX to work with multiple USB webcams at the 720 or 1080 settings? I’ve been able to get up to four webcams to work only if they are set to lower resolutions. USB 3.1 and USB-C provide more than enough bandwidth but it always gives a USB bandwidth error message when the webcams are set to higher resolutions.
Mark Schutte
Given my long-running exploration of webcams, I felt that I was especially well positioned to address this question. After all, how many people have a collection of such items readily at hand? While I answered in the comment trail on facebook, I think the info is worth sharing here as well.
It’s not uncommon for people to generalize that this simply can’t be done. Or that it requires a traditional boxy PC with dedicated USB add-in cards. While that can work, it may not be necessary. The generalizations make me uncomfortable. As with most things, the devil is in the details.
Experiment #1
With just a little attention to detail, you can have multiple webcams connected to a host, operating at 720p30 or even 1080p30. Here’s proof, a 4K sample video made using four relatively common USB-attached cameras….that is, webcams.
Here are the details about the sample video shown above:
- Created using vMix 4K, project set for 2160p30
- Running on Airtop-PC
- i7-5775C
- GTX 750 Ti
- 16 GB RAM
- 512 GB Samsung 960 SSD
- Anker USB 3.0 hub connected to USB 3.0 port on Airtop-PC
- Logitech C922 – connected to port #1 on Anker USB 3 hub
- Logitech Brio – connected to port #2 on Anker USB 3 hub
- Logitech Rally – connected to port #3 on Anker USB 3 hub
- Logitech C920 – connected to USB 2 port on host
- In vMix – all webcams set for 1920x1080p30, MJPEG video encoding
The system shows CPU at around 40%, which seems normal. The project was recorded to disk in 2160p at 20 Mbps using hardware encoding.
Experiment #2
A 1080p30 uncompressed (YUY2) stream requires around 1.5 Gbps. If we assume that MJPEG compression delivers a about 10:1 compression, that same stream should only require 150 kbps. I should be able to consolidate all four cameras onto the USB hub, thus loading only one USB 3 port on the host.
In practice, this proved to be unstable. Three cameras are stable and usable. Adding a fourth to the hub makes the arrangement unstable.
Experiment #3
It turned out that Mark is using a Lenovo X1 Carbon, not unlike my own. Although mine is a second generation unit (i5-3427U, 8 GB, 256 GB SSD, Intel 4000) from 2013 and his is gen 5 (i7-7600U, 8 GB, 265 GB SSD, Intel HD Graphics 620) . So, I moved the cameras to my laptop to see what could be done.
My older X1C has an i5 CPU and a single USB 3.0 port. It turns out that it can cope with three webcams configured for 720p30 and MJPEG encoding. Even that shows the host CPU at a constant 50%.
Setting the cameras for 1080p30 maxed out the CPU with nothing else going on. Clearly not usable.
Circling back to the original question: Yes! You can use at least four USB attached cameras connected to a single host, running at 1080p30, if you use MJPEG compression across the USB connections.