Raspberry Pi Streaming update: Raspberry Pi OS
The latest version of the Raspberry Pi operating system brings significant changes. Apart from the ususal software updates to the Debian 11 Bullseye base, Raspbian now got rebranded to Raspberry Pi OS. It now comes with a completely new software stack to access its various camera options called libcamera. Unfortunately that means that the old commands raspivid and raspistill will no longer work. So it’s time to update our previous post about how to stream with a Raspberry Pi.
Streaming with libcamera on Raspberry Pi OS
Luckily, there is not too much to change on the surface: For the most part, we just have to use the new command and change some parameter names. Our earlier example that streams at 720p in h264 now works like this:
libcamera-vid -t 0 --inline --listen --width 1280 --height 720 -b 15000000 --profile high --level 4.2 --framerate 30 -o tcp://0.0.0.0:3333 |
The --inline
option is quite interesting. It forces the stream header information to be included with every I (intra) frame. That makes it easy for a client to join a stream somewehere in the middle. Neat!
But just as before, libcamera never produced a fluid stream for me on my Raspberry Pi 3B+. So let’s look at alternatives.
Update 2023-02-07: I revisited libcamera in its current version and got it to work on my Raspi 3B+. I use the libav plugin to send the stream via RTMP to my target:
# I increased the bitrate manually to 2MBit/s |
VLC and ffmpeg streaming on Raspberry Pi OS
The VLC and ffmpeg interface did not change and works just as I described in how to stream with a Raspberry Pi. But they both depend on the old camera interface that raspivid and raspistill used. We have to reenable that before VLC and ffmpeg can be used to stream.
Enable Legacy Camera mode for VLC and ffmpeg
If you try to use VLC or ffmpeg on Raspberry Pi OS, you might encounter this VLC error:
[0000007f7c4cec80] v4l2 stream error: cannot start streaming: Invalid argument |
Ot the following error with ffmpeg:
[video4linux2,v4l2 @ 0x558969a030] fd:3 capabilities:a5a00001 |
That’s because they both rely on the old Raspbian camera subsystem. You can reenable the legacy camera system using raspi-config
:
sudo raspi-config |
Now select the interface options:
And enable the legacy camera support:
Now VLC and ffmpeg should work using /dev/video0
as before:
cvlc v4l2:///dev/video0 --v4l2-fps 30 --v4l2-width 1280 --v4l2-height 720 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:3333}' |
Fix ffmpeg operation not permitted error
Another issue that might pop up is a operation not permitted error with ffmpeg:
ffmpeg: ioctl(VIDIOC_STREAMON): Operation not permitted |
You can work around that by increasing the gpu memory in the boot config file:
gpu_mem=256 |