Sunday, April 23, 2023

How to suppress opencv / gst-launch-1.0 nvarguscamerasrc GST_ARGUS warning / debug messages

 Jetson camera library always prints debug information:




GST_ARGUS: Creating output stream

CONSUMER: Waiting until producer is connected...

GST_ARGUS: Available Sensor modes :

GST_ARGUS: 3264 x 2464 FR = 21.000000 fps Duration = 47619048 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 3264 x 1848 FR = 28.000001 fps Duration = 35714284 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1640 x 1232 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1280 x 720 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1280 x 720 FR = 120.000005 fps Duration = 8333333 ; Analog Gain range min 1.000000, max 10.625000; Exposure Range min 13000, max 683709000;

GST_ARGUS: Running with following settings:

   Camera index = 0 

   Camera mode  = 2 

   Output Stream W = 1920 H = 1080 

   seconds to Run    = 0 

   Frame Rate = 29.999999 

GST_ARGUS: Setup Complete, Starting captures for 0 seconds

GST_ARGUS: Starting repeat capture requests.

CONSUMER: Producer has connected; continuing.


These prints are hardcoded in the source file of the camera module gstnvarguscamerasrc.cpp as explained here . The following commands can be used to disable these hardcoded messages and compile the module.

Find the corresponding version of your nvidia jetpack and download its public_sources file

cat /etc/nv_tegra_release

cd ~/src 

# for R32 (release), REVISION: 7.3 Driver Package (BSP) Sources:  https://developer.nvidia.com/embedded/linux-tegra-r3273

wget --trust-server-names https://developer.nvidia.com/downloads/remack-sdksjetpack-463r32releasev73sourcest210publicsourcestbz2

tar -jxvf public_sources.tbz2*

cd Linux_for_Tegra/source/public

tar -jxvf gst-nvarguscamera_src.tbz2

cd gst-nvarguscamera/

vi gstnvarguscamerasrc.cpp

// delete printf in the following lines:

#define GST_ARGUS_PRINT(...)

#define CONSUMER_PRINT(...)

make

sudo make install

You may also use the following line to disable opencv warnings. It is also best to restart nvargus-daemon service each time before using the camera:

import warnings

warnings.filterwarnings('ignore')

import sys, os

os.system("sudo systemctl restart nvargus-daemon")

os.environ["DISPLAY"] = ":0"

os.environ["OPENCV_LOG_LEVEL"] = "OFF"

This will allow you to run your script without any warning messages:



Thursday, February 10, 2022

Install Asterisk 18 / FreePBX 16 on Raspbian Bullseye 64bit/32bit [Raspberry PI 4 aarch64/armhf]

I use this tutorial to setup RemoSIM.com product for customers.

To do:

- Add instructions for enabling fail2ban for asterisk 

- Fix the freepbx startup script issue on boot


I have written about installing Askteris 18 / Free PBX 15 on Ubuntu here before. 

A new version of Raspbian OS based on Debian Bullseye is now available 

Here is the gist I use to install FreePBX 16 on Raspbian Bullseye.

SSH to your raspberry: ssh pi@raspberry.IP.Address 

# Disable ipv6 if it is causing problems in your network:

echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p 

# update packages there 
sudo apt-get update && sudo apt-get dist-upgrade -y

#freepbx installation must be run as root, so login to SSH as root :

sudo passwd
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
service sshd restart

# Install required packages
apt install -y build-essential raspberrypi-kernel-headers apache2 mariadb-server mariadb-client php php-curl php-cli php-mysql php-pear php-gd php-mbstring php-intl php-bcmath curl sox mpg123 lame ffmpeg sqlite3 git unixodbc sudo dirmngr php-ldap nodejs npm pkg-config libicu-dev curl sox libncurses5-dev libssl-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libicu-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp2-dev libspandsp-dev sudo subversion libtool-bin python-dev unixodbc dirmngr sendmail-bin sendmail htop cmake libmariadb-dev-compat nload dnsutils vnstat

#add the following line to [mysqld] section of /etc/mysql/mariadb.conf.d/50-server.cnf
sql_mode=NO_ENGINE_SUBSTITUTION

# restart mariadb
service mariadb restart

# download and install asterisk 18
cd /usr/src
rm -fr asterisk-18-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz
tar xvfz asterisk-18-current.tar.gz
cd asterisk-18.*
contrib/scripts/get_mp3_source.sh
## This line is only needed on rpi 64 bit (arm64)
sed -i contrib/scripts/install_prereq -e "s,i386,armhf,g"
##
contrib/scripts/install_prereq install
./configure --with-pjproject-bundled --with-jansson-bundled
make menuselect.makeopts
menuselect/menuselect --enable app_macro --enable format_mp3 menuselect.makeopts
make
make install
make config
ldconfig
update-rc.d -f asterisk remove

# correct asterisk permissions
useradd -m asterisk
chown asterisk. /var/run/asterisk
chown -R asterisk. /etc/asterisk
chown -R asterisk. /var/{lib,log,spool}/asterisk
chown -R asterisk. /usr/lib/asterisk
rm -rf /var/www/html
mkdir /var/www/html # freepbx reinstall needed

# update apache config
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php/7.4/apache2/php.ini
sed -i 's/\(^memory_limit = \).*/\1256M/' /etc/php/7.4/apache2/php.ini
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
a2enmod rewrite
systemctl restart apache2

# https://mariadb.com/kb/en/mariadb-connector-odbc/
ver=3.1.17
cd /usr/src
wget https://dlm.mariadb.com/2454036/Connectors/odbc/connector-odbc-$ver/mariadb-connector-odbc-$ver-src.tar.gz
tar -zxvf mariadb-connector-odbc-$ver*
cd mariadb-connector-odbc-$ver*src/
mkdir build
cd build
# RPI 64 bit:
DM_DIR=/usr/lib/aarch64-linux-gnu cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCONC_WITH_UNIT_TESTS=Off -DCMAKE_C_FLAGS_RELWITHDEBINFO="-I/usr/include/mariadb -L/usr/lib"
# RPI 32 bit:
DM_DIR=/usr/lib/arm-linux-gnueabihf cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCONC_WITH_UNIT_TESTS=Off -DCMAKE_C_FLAGS_RELWITHDEBINFO="-I/usr/include/mariadb -L/usr/lib"
##
make
make install

# Configure ODBC

cat <<EOF > /etc/odbcinst.ini
[MySQL]
Description = ODBC for MySQL (MariaDB)
Driver = /usr/local/lib/mariadb/libmaodbc.so
FileUsage = 1
EOF


cat <<EOF > /etc/odbc.ini
[MySQL-asteriskcdrdb]
Description = MySQL connection to 'asteriskcdrdb' database
Driver = MySQL
Server = localhost
Database = asteriskcdrdb
Port = 3306
Socket = /var/run/mysqld/mysqld.sock
Option = 3
EOF

# Download and install freepbx
cd /usr/src
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-16.0-latest.tgz
tar vxfz freepbx-16.0-latest.tgz
touch /etc/asterisk/{modules,cdr}.conf
cd freepbx
./start_asterisk start
./install -n
fwconsole ma disablerepo commercial
fwconsole ma install callrecording core dashboard customappsreg infoservices logfiles pm2 soundlang sipsettings voicemail 
fwconsole ma downloadinstall soundlang
fwconsole reload

# Installing chan_dongle
apt-get install usb-modeswitch -y
cd /usr/src
git clone https://github.com/wdoekes/asterisk-chan-dongle
cd asterisk-chan-dongle
./bootstrap
./configure --with-astversion=18.10 --with-asterisk=/usr/src/asterisk-18.10.0/include
make
make install

# chown ttyUSB* devs to asterisk
echo 'KERNEL=="ttyUSB*", GROUP="dialout", OWNER="asterisk"' > /etc/udev/rules.d/50-udev-default.rules

# Freepbx startup script: /etc/systemd/system/freepbx.service
[Unit]
Description=FreePBX VoIP Server
After=mariadb.service
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/fwconsole start -q
ExecStop=/usr/sbin/fwconsole stop -q
 
[Install]
WantedBy=multi-user.target

systemctl enable freepbx --now


# Enable swap area on Raspberry 
dd if=/dev/zero of=/swapfile bs=1G count=1
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# add the following line to /etc/fstab
/swapfile swap swap defaults 0 0

delete journald folder so that it stores logs to RAM to avoid high disk io
rm -fr /var/log/journal

# compile atinout command 
cd /usr/src
wget http://sourceforge.net/projects/atinout/files/v0.9.1/atinout-0.9.1.tar.gz
tar -zxvf atinout*.gz
cd atinout-0.9.1
sed -i Makefile -e "s,-Werror,,g"
make
make install
mkdir /scripts


# add this script to send commands to all dongles {0..4} , 4 should be replaced by the number of dongles you have minus one
# vi /scripts/at
#!/bin/bash

dataports=`for i in {0..4}; do asterisk -rx "dongle show device state dongle$i" | grep "Device\|USB" | grep Data | awk '{print $3}'; done`

for data in $dataports; do
echo "$1" | timeout 1 atinout - $data - 2>&1
done

# add this script to remove all sms messages from sim cards / dongles : 
# vi /scripts/deletesms.sh
#!/bin/bash
# Storage types: https://www.developershome.com/sms/cpmsCommand.asp
# Reading commands: https://www.developershome.com/sms/cmgrCommand2.asp
# Delivery reports: https://stackoverflow.com/questions/18251903/how-to-handle-delivery-report-in-gsm-modem
/scripts/at AT+CPMS=\"SR\",\"SR\",\"SR\"
/scripts/at AT+CMGD=1,4
/scripts/at AT+CPMS=\"MT\",\"MT\",\"MT\"
/scripts/at AT+CMGD=1,4
/scripts/at AT+CPMS=\"ME\",\"ME\",\"ME\"
/scripts/at AT+CMGD=1,4
/scripts/at AT+CPMS=\"SM\",\"SM\",\"SM\"
/scripts/at AT+CMGD=1,4

# make them executable
chmod +x /scripts/at
chmod +x /scripts/deletesms.sh

# add deletesms.sh to cronjobs to avoid this bug 
# crontab -e
0 */6 * * * /scripts/deletesms.sh

# Adding a useful alias command: s
# typing s in shell would show status of all dongles with a refresh rate of 1 second:
# vi ~/.bashrc
alias s="watch -n1 'asterisk -rx \"dongle show devices\"'


# add the following cron jobs to keep raspberrypi updated
crontab -e
0 14 * * * apt-get update && apt-get dist-upgrade -y
0 17 * * * /usr/sbin/fwconsole ma refreshsignatures && /usr/sbin/fwconsole ma upgradeall
30 17 * * * /usr/sbin/fwconsole setting SIGNATURECHECK 0
30 17 * * * /usr/sbin/fwconsole setting MODULEADMINEDGE 1
0 18 * * * /usr/bin/rpi-eeprom-update -a

# The following script can be used to monitor your local VPN network (10.0.1.1 here)  and restart the vpn service (wireguard in this example) if the connection was not available. 
# vi /scripts/nointernet.sh
#!/bin/bash
if ping -c 1 10.0.1.1 &> /dev/null
then
  echo 1
else
  echo 0
  /bin/systemctl restart wg-quick@wg0
  /bin/systemctl restart wg-quick@wg1
  sleep 5
  /scripts/tg.py --sender 'System' --dongle 'system' --destination 'system' --message "There was no internet connection, the VPN service was restarted"

fi

# The following scripts can be used to monitor number of dongles you have ( here 5 ) and restart them if they were disconnected
# vi /scripts/down.sh

#!/bin/bash
numdongles=5
downs=$(/usr/sbin/asterisk -rx "dongle show devices" | grep "Not connec\|GSM not\|Unknown" | awk '{print $1}')
now=$(date +'%m-%d-%Y')

# reset down dogles
for down in $downs; do
        /scripts/tg.py --sender 'system' --dongle 'system' --destination 'system' --message "dongle $down was down and it was reset";
        /usr/sbin/asterisk -rx "dongle reset $down";
#        /usr/sbin/asterisk -rx "dongle restart now $down";
done

# need to reset raspberry if all dongles are in Not connected state :
downs=$(/usr/sbin/asterisk -rx "dongle show devices" | grep "Not connec" | awk '{print $1}' | wc -l)
if [ $downs -eq $numdongles ]; then
        /scripts/tg.py --sender 'system' --dongle 'system' --destination 'system' --message "all donlges were down and the pi was restarted";
        /bin/dmesg > /scripts/log/dmesg-$now.txt
        /scripts/restart.sh
fi

# need to reset raspberry if one of dongles is disconnected
notconnected=$(/usr/bin/lsusb | grep Huawei | wc -l)
if [ $notconnected -ne $numdongles ]; then
        /scripts/tg.py --sender 'system' --dongle 'system' --destination 'system' --message "one of dongles was not listed in lsusb and the dongle was restarted";
        /bin/dmesg > /scripts/log/dmesg-$now.txt;
        /scripts/restart.sh
fi

Monday, February 7, 2022

Setting a SAMBA net HDD on Rapberry PI for HIKVision IP Camera IPC-B120


 HIKVision Value Cameras are affordable CCTV cameras that have amazing features such as internal motion detection, IR night vision and power over ethernet (PoE). Among its available products, there are IPC-B121H which has bult-in H.265+ encoding for saving storage, and IPC-B120-D-W which is a wireless camera with Microphone.

The motion detection feature can be used to avoid recording the whole day, and only record when a motion is detected. 

These cameras need a network HDD to store their recordings. It is possible to create such a net HDD using Raspberry. Pi.

Here is an instruction on how to create a SAMBA net HDD using a raspberry pi. Here is another config that is suggested for HikVision cameras however it does not work either. 

The default configuration does not work on HikVision cameras and the camera returns this error when testing the storage:

Mounting to NAS server failed. Invalid directory or incorrect user name/password.

Samba Error hikvision Pi



The reason for this error is explained here . This can be fixed by adding ntlm auth = yes (required since SAMBA v4.5server min protocol = LANMAN1 (required since SAMBA v4.11) to /etc/samba/smb.conf and restarting the samba server.
In addition, it is possible to add log level = 1 to /etc/samba/smb.conf file to enable logging if it still does not work. If it still does not work, compare the output of testparm -v from an old working version of samba with your version.

The following config in /etc/samba/smb.conf is needed for hikvision to work properly:
[parking]
create mask = 0660
force create mode = 0660
force directory mode = 0770
path = /home/pi/parking
read only = No
valid users = @pi
 Note that the connection information in hikvision camera should be entered like this:
Server Address: Raspberry Pi IP
File Path  (note that it must start with /) : /parking
The username and password needs to be created by using smbpasswd .
With this configuration, it works properly
hikvision pi samba working

It is needed to add a separate partition for the camera on the raspberry pi to avoid the camera making the disk space full.

Monday, June 7, 2021

AirMaster 3100V vs Greenpacket DT-350

مقایسه AirMaster 3100V و DT-350 با سیم کارت ایرانسل آنلاک

In this post, I am going to compare AirMaster 3100V (Software Version: V2.0.0B31) and GreenPacket DT-350 TD-LTE modems. They both support Band 42 which is used by some companies for providing TD-LTE internet, such as Irancell and Mobinnet in Iran.

To do the test, I put the modems in the same location at about the same time and made the tests.

I used the same Irancell simcard on both modems. It is possible to use an Irancell simcard on the AirMaster 3100V modem provided by irancell however you first need to allow it in modem settings (192.168.1.1/lte/simcardinfo.asp) as explained here. The common Root passwords (note that both the username and password are case-sensitive) for this airmaster modem is mentioned here and here :

PWDd0N~WH*4G#DN

R0Br0o^S85~LT3@MN

RoBJ@!M85~LT3#95*MN

It is not possible to use a mobinnet simcard on a DT-350 modem provided by Irancell as the modem does not allow it.


Here are the results, for AirMaster 3100v modem with an Irancell simcard:





and for DT-350 with the same Irancell simcard in the same location:








We see that AirMaster 3100V had a better performance compared to the DT-350 modem.

Friday, June 4, 2021

How to do MTU discovery on Linux and Mac



To find the optimal MTU for your network, you need to find the maximum packet size you can send through it. 

on Mac  use the following command to send ping packets with a MTU size of 1500 :

ping -D -s $((1500-28)) -c 1 1.1.1.1

and on linux use:

ping -M do -D -s $((1500-28)) -c 1 1.1.1.1


To find the default MTU that is set on your device, use the following command on linux 

ip -d link list

and on mac use :

networksetup -getMTU en0

ifconfig should also show the default MTU for your network interfaces.


Tuesday, May 18, 2021

[How To] Apache Websockets WSS in a Subfolder

 The following syntax can be used to run websocket connections in Apache in a subfolder : 

# /websocket1 to port 2085

RewriteCond %{REQUEST_URI} /websocket1 [NC]

RewriteCond %{HTTP:Upgrade} "(?i)websocket" [NC,OR]

RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]

RewriteRule ^/(.*)$ ws://127.0.0.1:2085/$1 [P,QSA,L]


# /websocket2 to port 3126

RewriteCond %{REQUEST_URI} /websocket2 [NC]

RewriteCond %{HTTP:Upgrade} "(?i)websocket" [NC,OR]

RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]

RewriteRule ^/(.*)$ ws://127.0.0.1:3126/$1 [P,QSA,L]

The above need to be used in a SSL virtualhost.

For a non-SSL virtualhost, one can simply use:

ProxyPass "/websocket1" "ws://127.0.0.1:2085/"
ProxyPass "/websocket2" "ws://127.0.0.1:3126/"

Tuesday, May 11, 2021

Stable Jitsi meet setup on Raspberry Pi 4 + TV + Webcam

 It feels much better to run meetings on a big screen TV rather than a phone or regular monitors.

Raspberry Pi 4 can be connected to a TV to run such meetings. The setup is not straightforward though, you may get an overloaded Pi with lags in meeting with the default configuration.

Here are the points to consider to make a stable setup:

1. The 3.5mm jack port on Pi 4 does NOT support microphone. You need to use a USB microphone or a 3.5mm jack headphone + a USB audio card. Cheap USB microphones / audio cards do not have an acceptable quality and you would get a noisy input. So you would either need to order a professional USB microphone which is expensive, or go for a logtech webcam which has a quite decent built-in microphone. A list of tested webcams on Pi is provided here.

I went for the latter and ordered Logitech C310 and it worked smoothly. 

A 4k HDMI cable is also needed to connect pi to a 4k TV. You may also enable 60fps for your 4k TV, I did not test it though as my TV was not 4K.

2. Streaming is resource consuming and you would need to get a fan for your Pi. Official Raspberry Pi Fan is a good choice as it can be configured to turn on whenever CPU temperature gets above a certain degree.

Also, get a powerful enough adapter for your Pi. I ordered Mi 27W adapter which can provide 3A 5V. With a good adapter and fan, you can overclock your Pi to get 2Ghz CPU cores / 700Mhz GPU cores.

Enable G2 GL for your Pi to get hardware acceleration, and set gpu_mem to max recommended

# /boot/config.txt 

# hdmi_force_hotplug is required for libcec https://github.com/Pulse-Eight/libcec#raspberry-pi

hdmi_force_hotplug=1

# Overclocking

over_voltage=6

arm_freq=2000

gpu_freq=700

[pi4]

# Enable DRM VC4 V3D driver on top of the dispmanx display stack

dtoverlay=vc4-fkms-v3d

max_framebuffers=2

[all]

dtoverlay=vc4-fkms-v3d

[all]

dtoverlay=gpio-fan,gpiopin=14,temp=60000

gpu_mem=256


disable xcompmgr composition manager to reduce screen tearing as mentioned here

sudo mv /etc/xdg/autostart/xcompmgr.desktop /home/pi/backup.xcompmgr.deskto

and reboot the Pi. Without this setting, you would see glitches in your jitsi calls.

You may also want to disable sceen blanking in raspi-config . 

3. Install v4l-utils package and add set raspberry pi to configure your webcam to its max res on startup

# /etc/rc.local

# /usr/bin/v4l2-ctl -d /dev/video0 --get-fmt-video 

# /usr/bin/v4l2-ctl -d /dev/video0 --list-formats-ext

/usr/bin/v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=1

Pi Camera v2 is not a good option to use as camera. Although it has a wider field of view, it does not include microphone, its cable and mounting are pain. It is said that Pi Camera connects to GPU and creates less CPU load for streaming however in my tests it caused about 2x higher CPU load compared to logitech C310 no matter what encoding was used in v4l2-ctl for the Pi camera.

4. Launch Chromium with these options :

/usr/bin/chromium-browser --use-fake-ui-for-media-stream --no-first-run --no-zygote --no-sandbox --disable-setuid-sandbox

in chrome://gpu you can see the status of gpu acceleration. You may use chrome://flags to enable more options for hardware acceleration such as "GPU rasterization", "Override software rendering list", "Hardware-accelerated video decode"

5. Add the following configuration to the end of your Jitsi Room URL :

https://Jitsi.Yourdomain/ROOM#config.disableSimulcast=true&config.enableLayerSuspension=true&config.disableSuspendVideo=true&config.disableAudioLevels=true&config.p2p.enabled=false&config.disableH264=false&config.preferH264=true

You need to ensure that everybody who joins the room uses these parameters. You can hover the mouse on top left signal bar on their thumbnail and ensure that participants are using H264 encoding.

I used Apache rewrite rules on my jitsi hosted server to force these parameters for everyone joining the room: 

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://Jitsi.Yourdomain/check.html [NC]
RewriteRule ^/?ROOM$ https://Jitsi.Yourdomain/check.html [R=302,NC,L,R,NE]

<Files check.html>
FileETag None
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</Files>

or with nginx:

location ~ ^/ROOM {
    if ($http_referer !~* "https://Jitsi.Yourdomain/check.html") {
    rewrite ^/ROOM$ check.html redirect;
    }
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://127.0.0.1:8480;
}

location /check.html {
    add_header Last-Modified $date_gmt;
    add_header Cache-Control 'no-store, no-cache';
    if_modified_since off;
    expires off;
    etag off;
    root   /var/www/html;
    index  index.html index.htm;
}

This checks if the referrer of the URL to join the room is check.html or not. If it is not check.html, it redirects the page to check.html . Now in the check.html file we can set whatever parameters we want and redirect it to our ROOM :

<html>
  <head>
    <meta http-equiv="Cache-control" content="No-Cache">
  </head>
  <body>
    <form id="redirect" action="https://Jitsi.Yourdomain/ROOM#config.disableSimulcast=true&config.enableLayerSuspension=true&config.disableSuspendVideo=true&config.disableAudioLevels=true&config.p2p.enabled=false&config.disableH264=false&config.preferH264=true&videoQuality.preferredCodec=H264" method="get"></form>
    <script>
      document.getElementById("redirect").submit();
    </script>
  </body>
</html>

You may also add
 &config.webrtcIceUdpDisable=true&config.webrtcIceTcpDisable=false
to the check.html action URL and use JVB_TCP_HARVESTER_DISABLED=false in the .env file of your docker-jitsi-meet to disable UDP in jitsi.

At 720p, each camera requires an average of 200 KB/s (1.6 Mbps) of upload bandwidth and support for peak rates of 500 KB/s (4.0 Mbps) of upload bandwidth.

With the above settings, I was able to run Jitsi meetings quite smoothly on the Pi with HD streaming on both ends. Here is the server load on Pi after 20mins in the jitsi session:



How to Stream RTSP / Webcam / IP Camera Over the Web

I had a Hikvision IPC-B120 that provides a simple RTSP stream, which I could view in VLC. I also wanted to see my Logitech BRIO’s feed in a ...