As part of spiffing my video presence for SquidWrench Zoom meetings, I put a knockoff RPi V1 camera into an Az-El mount, stuck it to a Raspberry Pi, installed the latest OS Formerly Known as Raspbian, did a little setup, and perched it on the I-beam over the workbench:

The toothbrush head has a convenient pair of neodymium magnets affixing the RPi’s power cable to the beam, thereby preventing the whole lashup from falling off. The Pi, being an old Model B V 1.1, lacks onboard WiFi and requires a USB WiFi dongle. The white button at the lower right of the heatsink properly shuts the OS down and starts it up again.
Zoom can show video only from video devices / cameras attached to the laptop, so the trick is to make video from the RPi look like it’s coming from a local laptop device.
Start by exporting video from the Raspberry Pi:
raspivid --nopreview -t 0 -rot 180 -awb sun --sharpness -50 --flicker 60hz -w 1920 -h 1080 -ae 48 -a 1032 -a 'RPi Cam1 %Y-%m-%d %X' -b 1000000 -l -o tcp://0.0.0.0:5000
The -rot 180 -awb sun --sharpness -50 --flicker 60hz
parameters make the picture look better. The bottom of the video image There is no way to predict which side of the video will be on the same side as the cable, if that’s any help figuring out which end is up, and the 6500 K LED tubes apparently fill the shop with “sun”.
The -l
parameter causes raspivid
to wait until it gets an incoming tcp connection on port 5000 from any other IP address, whereupon it begins capturing video and sending it out.
Then, on the laptop, create a V4L loopback device:
sudo modprobe v4l2loopback devices=1 video_nr=10 exclusive_caps=1 card_label="Workbench"
Zoom will then include a video source identified as “Workbench” in its list of cameras.
Now fetch video from the RPi and ram it into the loopback device:
ffmpeg -f h264 -i tcp://192.168.1.50:5000 -f v4l2 -pix_fmt yuv420p /dev/video10
VLC knows it as /dev/video10
:

That’s the edge of the workbench over there on the left, looking distinctly like a cliff.
The RPi will happily stream video all day long to ffmpeg
while you start / stop the display program pulling the bits from the video device. However, killing ffmpeg
also kills raspivid
, requiring a manual restart of both programs. This isn’t a dealbreaker for my simple needs, but it makes unattended streaming from, say, a yard camera somewhat tricky.
There appear to be an infinite number of variations on this theme, not all of which work, and some of which rest upon an unsteady ziggurat of sketchy / unmaintained software.
Addendum: If you have a couple of RPi cameras, it’s handy to run the matching ssh
and ffmpeg
sessions in screen
/ tmux
/ whatever terminal multiplexer you prefer. I find it easier to flip through those sessions with Ctrl-A N
, rather than manage half a dozen tabs in a single terminal window. Your mileage may differ.