Screen / tab sharing is not working properly

Hello,

i am running an on-prem Jitsi-Meet server without cloud connection or direct internet connection. Internet works if necessary only via a proxy.

Operating system: Debian 10 (Buster)
Browser: Google Chrome and Mozilla Firefox
Installed Jitsi packages:
jitsi-meet 2.0.7287-1
jitsi-meet-prosody 1.0.6155-1
jitsi-meet-turnserver 1.0.6155-1
jitsi-meet-web 1.0.6155-1
jitsi-meet-web-config 1.0.6155-1
jitsi-videobridge2 2.1-681-g3544ed05-1

inxi output:

CPU: 4x Single Core Intel Xeon Silver 4216 (-SMP-) speed: 2095 MHz
Kernel: 4.19.0-20-amd64 x86_64 Up: 1d 21h 57m Mem: 1110.3/7978.3 MiB (13.9%)
Storage: 50.00 GiB (16.8% used) Procs: 158 Shell: bash 5.0.3 inxi: 3.0.32

The problem is when someone shares a screen or tab, the image eventually goes away on the other users and then comes back. This sometimes happens several times in a row. When the image goes away, then it looks to the other users like the share has ended.

EDIT: Jitsi is used exclusively in the local network

I can’t find any error in the log files.

Best regards,
Thilo

1 Like

Is there any error in the browser console?

The following messages appear at the beginning:

interop.js:352 The description does not look like plan-b
toUnifiedPlan @ interop.js:352
Pc.setRemoteDescription @ TraceablePeerConnection.js:2416
_responderRenegotiate @ JingleSessionPC.js:2084
_renegotiate @ JingleSessionPC.js:2072
(anonymous) @ JingleSessionPC.js:1892
_processQueueTasks @ AsyncQueue.js:30
(anonymous) @ async.mjs:4005
process @ async.mjs:1668
(anonymous) @ async.mjs:1526
(anonymous) @ async.mjs:68
XMLHttpRequest.send (async)
d @ strophe.umd.js:5123
_processRequest @ strophe.umd.js:5137
_throttledRequestHandler @ strophe.umd.js:5290
_onIdle @ strophe.umd.js:4901
_onIdle @ strophe.umd.js:3881
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:3886
setTimeout (async)
_onIdle @ strophe.umd.js:3885
(anonymous) @ strophe.umd.js:5257
setTimeout (async)
_send @ strophe.umd.js:5256
send @ strophe.umd.js:2583
sendIQ @ strophe.umd.js:2740
sendIQ @ XmppConnection.js:511
(anonymous) @ XmppConnection.js:525
sendIQ2 @ XmppConnection.js:523
ping @ strophe.ping.js:89
(anonymous) @ strophe.ping.js:120
Logger.js:154 2022-05-18T11:53:49.009Z [modules/RTC/TraceablePeerConnection.js] <Pc._remoteTrackRemoved>:  TPC[id=1,type=JVB] remote track removed stream[id=73c9360e-video-1,trackId=05142d78-16eb-4d0b-97be-ac9d49a37868-1]
Logger.js:154 2022-05-18T11:53:49.070Z [modules/xmpp/JingleSessionPC.js] JingleSessionPC[session=JVB,initiator=false,sid=8mrudtklrh2dl] removeRemoteStream - OK
Logger.js:154 2022-05-18T11:53:49.121Z [features/video-quality] <Object.Zt.register.deepEquals [as listener]>:  Video quality level for thumbnail height: 447, is: 360, override: false, max full res N: 2
Logger.js:154 2022-05-18T11:53:49.229Z [modules/UI/videolayout/LargeVideoManager.js] hover in 73c9360e
Logger.js:154 2022-05-18T11:53:52.072Z [modules/xmpp/strophe.jingle.js] <Fo.onJingle>:  Found a JSON-encoded element in source-add, translating to standard Jingle.
Logger.js:154 2022-05-18T11:53:52.080Z [modules/xmpp/JingleSessionPC.js] JingleSessionPC[session=JVB,initiator=false,sid=8mrudtklrh2dl] Processing addRemoteStream
Logger.js:154 2022-05-18T11:53:52.120Z [modules/RTC/TraceablePeerConnection.js] <Pc._remoteTrackAdded>:  TPC[id=1,type=JVB] adding remote track for stream[id=73c9360e-video-1,type=video]
Logger.js:154 2022-05-18T11:53:52.121Z [modules/RTC/TraceablePeerConnection.js] <Pc._remoteTrackAdded>:  TPC[id=1,type=JVB] creating remote track[endpoint=73c9360e,ssrc=524254142,type=video,sourceName=undefined]
Logger.js:154 2022-05-18T11:53:52.143Z [modules/UI/videolayout/LargeVideoManager.js] hover in 73c9360e
Logger.js:154 2022-05-18T11:53:52.178Z [modules/xmpp/JingleSessionPC.js] JingleSessionPC[session=JVB,initiator=false,sid=8mrudtklrh2dl] addRemoteStream - OK
Logger.js:154 2022-05-18T11:54:05.471Z [modules/UI/videolayout/LargeVideoManager.js] hover in 73c9360e
BridgeChannel.js:84 WebSocket connection to 'wss://s1010035.mind.spoc.loc/colibri-ws/default-id/a5e7964385f38a55/8169b7c7?pwd=aca236s4rl2uqn16s5fikuqbe' failed: 
_initWebSocket @ BridgeChannel.js:84
t @ BridgeChannel.js:103
Logger.js:154 2022-05-18T11:54:24.154Z [modules/RTC/BridgeChannel.js] <WebSocket.e.onclose>:  Channel closed by server
Logger.js:154 2022-05-18T11:54:24.155Z [modules/RTC/BridgeChannel.js] <WebSocket.e.onclose>:  Channel closed: 1006 

However, even if the image does not disappear.

There is a websocket issue.

  • Do you have a valid TLS certificate?
  • Do you have additional JVBs?

The certificate was created by me at our Active Directory certification authority and deposited accordingly.

/usr/local/share/ca-certificates/mind/LDK_Issuing_CA.crt
/usr/local/share/ca-certificates/mind/LDK_Root_CA.crt
/etc/jitsi/meet/s1010035.mind.spoc.loc.crt
/etc/jitsi/meet/s1010035.mind.spoc.loc.key
/etc/nginx/sites-enabled/s1010035.mind.spoc.loc.conf:

server_names_hash_bucket_size 64;

server {
    listen 80;
    listen [::]:80;
    server_name s1010035.mind.spoc.loc;

    location ^~ /.well-known/acme-challenge/ {
       default_type "text/plain";
       root         /usr/share/jitsi-meet;
    }
    location = /.well-known/acme-challenge/ {
       return 404;
    }
    location / {
       return 301 https://$host$request_uri;
    }
}
server {
    listen 4444 ssl http2;
    listen [::]:4444 ssl http2;
    server_name s1010035.mind.spoc.loc;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";

    add_header Strict-Transport-Security "max-age=31536000";

    ssl_certificate /etc/jitsi/meet/s1010035.mind.spoc.loc.crt;
    ssl_certificate_key /etc/jitsi/meet/s1010035.mind.spoc.loc.key;

    root /usr/share/jitsi-meet;

    # ssi on with javascript for multidomain variables in config.js
    ssi on;
    ssi_types application/x-javascript application/javascript;

    index index.html index.htm;
    error_page 404 /static/404.html;

    gzip on;
    gzip_types text/plain text/css application/javascript application/json;
    gzip_vary on;

    location = /config.js {
        alias /etc/jitsi/meet/s1010035.mind.spoc.loc-config.js;
    }

    location = /external_api.js {
        alias /usr/share/jitsi-meet/libs/external_api.min.js;
    }

    #ensure all static content can always be found first
    location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
    {
        add_header 'Access-Control-Allow-Origin' '*';
        alias /usr/share/jitsi-meet/$1/$2;
    }

    # BOSH
    location = /http-bind {
        proxy_pass      http://localhost:5280/http-bind;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_host;
    }

    # xmpp websockets
    location = /xmpp-websocket {
        proxy_pass http://127.0.0.1:5280/xmpp-websocket?prefix=$prefix&$args;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        tcp_nodelay on;
    }

    location ~ ^/([^/?&:'"]+)$ {
        try_files $uri @root_path;
    }

    location @root_path {
        rewrite ^/(.*)$ / break;
    }

    location ~ ^/([^/?&:'"]+)/config.js$
    {
       set $subdomain "$1.";
       set $subdir "$1/";

       alias /etc/jitsi/meet/s1010035.mind.spoc.loc-config.js;
    }

    #Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
    location ~ ^/([^/?&:'"]+)/(.*)$ {
        set $subdomain "$1.";
        set $subdir "$1/";
        rewrite ^/([^/?&:'"]+)/(.*)$ /$2;
    }

    # BOSH for subdomains
    location ~ ^/([^/?&:'"]+)/http-bind {
        set $subdomain "$1.";
        set $subdir "$1/";
        set $prefix "$1";

        rewrite ^/(.*)$ /http-bind;
    }

    # websockets for subdomains
    location ~ ^/([^/?&:'"]+)/xmpp-websocket {
        set $subdomain "$1.";
        set $subdir "$1/";
        set $prefix "$1";

        rewrite ^/(.*)$ /xmpp-websocket;
    }
}

EDIT: Additional JVBs do not exist.

Why don’t you have Colibri websocket block in your config file?

1 Like

That’s a good question. I have been running this installation since March 2020 and update it constantly. I don’t remember what instructions I followed at the time. colibri was not a topic in the instructions, otherwise I would have configured it.

I’ll activate that and get back to you.

Hello,
it looks like that’s it. Since activating the Colibri websocket it works flawlessly.

Many thanks and greetings
Thilo

1 Like