FOSSMeet Video Team

From WIKI FOSSCELL NITC

This Page is to describe how the FOSSMeet'24 video stream was setup.

Live Streaming Server

The live streaming server was setup using nginx (with an rtmp module). Please use this link to get an insight of the config files involved and brief explanation of concepts behind it.

We used a VM in SSL with 6 Cores and 6 GB of RAM, however even with around 10-15 concurrent consumers, the server was not under heavy load (<10% thats how amazing nginx is). We didn't configure to serve multiple resolutions and bitrates, so maybe the reason for less load was that. The VM needs a port apart from https open to the internet to accept rtmp traffic.

Please consult Software Systems Lab Admins for the exact ports used as it wont be disclosed here. We also had Software System Lab's internet facing proxy and the SSL/TLS connection was terminated over there. This config was run in the VM inside a docker container. ( We had issues with using this config on nginx outside docker, and we just stuck with the parent docker container of the template).

daemon off;

error_log /dev/stdout info;

events {
    worker_connections 1024;
}

rtmp {
    server {
        listen ${RTMP_PORT};
        chunk_size 4000;

        application hls {
            live on;
            hls on;
            hls_fragment_naming system;
            hls_fragment 5;
            hls_playlist_length 10;
            hls_path /opt/data/hls;
            hls_nested on;

	    #hls_variant _720p2628kbs BANDWIDTH=2628000,RESOLUTION=1280x720;
            #hls_variant _480p1128kbs BANDWIDTH=1128000,RESOLUTION=854x480;
            #hls_variant _360p878kbs BANDWIDTH=878000,RESOLUTION=640x360;
            #hls_variant _240p528kbs BANDWIDTH=528000,RESOLUTION=426x240;
            #hls_variant _240p264kbs BANDWIDTH=264000,RESOLUTION=426x240;
        }
    }
}

http {
    root /www/static;
    sendfile off;
    tcp_nopush on;
    server_tokens off;
    access_log /dev/stdout combined;

    # Uncomment these lines to enable SSL.
    # ssl_protocols TLSv1.2 TLSv1.3;
    # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    # ssl_prefer_server_ciphers off;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 1d;

    server {
        listen ${HTTP_PORT};

        # Uncomment these lines to enable SSL.
        # Update the ssl paths with your own certificate and private key.
            
        # listen ${HTTPS_PORT} ssl;
        # ssl_certificate     /opt/certs/example.com.crt;
        # ssl_certificate_key /opt/certs/example.com.key;

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /opt/hlsdata;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }

        location /live {
          alias /opt/data/hls;
          types {
              application/vnd.apple.mpegurl m3u8;
              video/mp2t ts;
          }
          add_header Cache-Control no-cache;
          add_header Access-Control-Allow-Origin *;
        }

        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root /www/static;
        }

        location /crossdomain.xml {
            default_type text/xml;
            expires 24h;
        }
    }
}

Broadcast Side

Requirements
  1. OBS studio
  2. DSLR Camera and Mini USB cable
  3. gstreamer drivers

Any RTMP client can be used to push to the server. We used OBS Studio to capture the video stream.

Problems faced

  • We had trouble with DSLR input and this could have been mitigated if we tested this a day before. The problem was that we thought DSLR video input could be taken as plug and play but it wasn't the case in GNU/Linux. We ended up using Windows with proprietary drivers from Canon. We didn't know much about gstreamer and the run time heat prevented us from testing it.
  • We didn't have an audio input line from the Audio team, and the wire they provided made static. Please put down audio input to laptop via USB/AUX as a requirement from the Audio team. We had to use the DSLR's mic as input, it was OK but not the best.
Stream key setup in OBS Studio/Streaming settings tab.

However assuming DSLR input and an audio input is ready in OBS, head over to settings/Streaming. Here set the upstream link as rtmp://domain>:<custom_port>/app_name in the nginx config (our app_name was hls and domain was live.fosscell.org, check rtmp block in nginx config above). You can choose to omit :custom_port if you are using 1935 (default). We didn't setup authentication in our nginx server, that could be explored by the next years team!


Once this is done, you can just hit start streaming in OBS :).