I've got 9 Panasonic cameras (bl-c101a & bl-c140a). I used to use a browser on my main computer to display these on a second monitor; 9 320x240 mjpeg streams. Either IE with old active-x controls or Firefox, which can just play the motion-jpegs as img src.
I have a Raspberry Pi 3b+ that I use to record h264 mpeg4 streams from the cameras using ffmpeg. I also use the rpi for other things. I decided to try to move the camera display to the rpi, also. So I moved the 1366x768 monitor to the rpi hdmi port, and got it working with Firefox and the i3 window manager.
The cpu load was heavy, but it was useable at 3fps (normally I display mjpeg at 10fps). Then, I decided to try ffplay (part of the ffmpeg distribution). I also switched from i3 to the bspwm window manager.
Using ffplay to play the rtsp mpeg4 streams instead of using mjpeg with Firefox made a dramatic improvement. Even with 9 separate ffplay streams (320x240 at 15fps and 512kbps), the cpu use is very low. Even with the ffmpeg recording and everything else I've got running, the cpu is around 70-75% idle.
I specify the window positioning with ffplay, so it displays the cameras in a 3x3 grid, and I put a clock on the right side, since there's extra space there.
I will note, I tried a lot of different clocks, and also terminals, specifying the geometry for the layout, and I only found one clock that actually did it, buici-clock. None of the terminal consoles or other clocks would actually start in the specified screen position.
I'll document the settings for this here, in case someone runs across this and is trying to do something similar.
xset s off xset -dpms xset s noblank exec bspwm
#! /bin/sh pgrep -x sxhkd > /dev/null || sxhkd & bspc monitor -d I II III IV V VI VII VIII IX X bspc config border_width 0 bspc config window_gap 10 bspc config split_ratio 0.52 bspc config borderless_monocle true bspc config gapless_monocle true ffplay -an -flags low_delay -left 14 -top 14 -window_title cam1 'rtsp://user:firstname.lastname@example.org/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 344 -top 14 -window_title cam2 'rtsp://user:email@example.com/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 674 -top 14 -window_title cam3 'rtsp://user:firstname.lastname@example.org/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 14 -top 264 -window_title cam4 'rtsp://user:email@example.com/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 344 -top 264 -window_title cam5 'rtsp://user:firstname.lastname@example.org/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 674 -top 264 -window_title cam6 'rtsp://user:email@example.com/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 14 -top 514 -window_title cam7 'rtsp://user:firstname.lastname@example.org/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 344 -top 514 -window_title cam8 'rtsp://user:email@example.com/nphMpeg4/nil-320x240' & ffplay -an -flags low_delay -left 674 -top 514 -window_title cam9 'rtsp://user:firstname.lastname@example.org/nphMpeg4/nil-320x240' & buici-clock -geometry 300x300+1030+14 &
#!/bin/bash exec nohup su -l root -c startx >/dev/null 2>&1 &
#!/bin/bash pkill buici-clock pkill ffplay pkill bspwm
#!/bin/bash /opt/utils/stop-x.sh sleep 1 /opt/utils/start-x.sh