Page tree
Skip to end of metadata
Go to start of metadata

Nous conseillons de mettre en place le direct sur une autre VM que Pod.

Le live se base sur le moduel Rtmp de Nginx.

Pré-requis

  • Installation : Debian 9.4 64 bits


Pour installer nginx en version 1.14, il faut d'abord ajouter les backports :
Se placer en tant que root (sudo -s)
$> vim /etc/apt/sources.list 
ajouter la ligne :  deb http://ftp.debian.org/debian stretch-backports main
puis faire une mise à jour
$> apt update

Installation de nginx
$> apt-get -t stretch-backports install nginx
Ensuite, il faut installer le module nginx-rtmp : 
$> apt-get install libnginx-mod-rtmp

ffmpeg
Pour le multibitrate, il faut installer ffmpeg qui encode en temps réel le flux vidéo:
$> aptitude install ffmpeg
    
Pour vérifier que tout s'est bien passé, il faut lister le répertoire modules enabled de nginx :
$> ls -l /etc/nginx/modules-enabled/

Vous devez voir mod-rtmp.conf :

total 16

[...]

lrwxrwxrwx 1 root root 48 oct.  17 12:59 50-mod-rtmp.conf -> /usr/share/nginx/modules-available/mod-rtmp.conf

[...]


Ensuite, il faut ajouter l'instruction include rtmp dans le nginx.conf  et créer le snippets conrrespondant :

$> vim /etc/nginx/nginx.conf
[...]
include /etc/nginx/snippets/rtmp.conf;
[...]

Il faut donc ensuite créer le snippet RTMP :

$> vim /etc/nginx/snippets/rtmp.conf 
rtmp {

    server {

        listen 1935; # port rtmp par defaut
        chunk_size 4096; # taille des paquets transmis/découpé

         application live { # nom de l'application (on peut mettre toto/tatta etc.
            live on;
            #meta copy; 
            #record off;

            # publish only from localhost
            allow publish 127.0.0.1; # seulement poublier en local
            allow publish all; #tout le monde peut publier
            allow play all; # certaine adresse IP on le droit de lire
            deny publish all; # mettre un deny à la fin pour securiser 

            exec ffmpeg -i rtmp://localhost/$app/$name -async 1 -vsync -1
                -c:v libx264 -c:a aac -b:v 256k -b:a 32k -vf "scale=480:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/show/$name_low
                -c:v libx264 -c:a aac -b:v 768k -b:a 128k -vf "scale=720:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://localhost/show/$name_high
                -c copy -f flv rtmp://localhost/show/$name_src >/tmp/ffmpeg.log 2>&1 ;

            exec_publish curl --request PATCH "https://pod.univ.fr/rest/broadcasters/$name/" --header "Content-Type: application/json" --header "Accept: application/json" --user CHANGE_USERNAME:CHANGE-THIS-STATUS-PASSWORD --data "{\"status\":true}";

            exec_publish_done curl --request PATCH "https://pod.univ.fr/rest/broadcasters/$name/" --header "Content-Type: application/json" --header "Accept: application/json" --user CHANGE_USERNAME:CHANGE-THIS-STATUS-PASSWORD --data "{\"status\":false}";


        }


        # This application is for splitting the stream into HLS fragments
        application show {
            live on; # Allows live input from above
            meta copy; 
            record off;

            hls on; # activation du hls 
            hls_path /dev/shm/hls; #chemin des fragment ts mettre dans /dev/shm pour eviter de faire trop travailler le disque
            hls_nested on; # cree un sous repertoire par stream envoye
            hls_fragment 2s; #taille des fragments 
            
            # Instruct clients to adjust resolution according to bandwidth
            hls_variant _low BANDWIDTH=288000; # Low bitrate, sub-SD resolution
            hls_variant _high BANDWIDTH=1152000; # High bitrate, higher-than-SD resolution
            hls_variant _src BANDWIDTH=4096000; # Source bitrate, source resolution
        }

    }
}

Vous pouvez voir toutes les directives de ce module à cette adresse : https://github.com/arut/nginx-rtmp-module/wiki/Directives

HTTP:
Il faut enfin déclarer la route hls pour lire les vidéos : 

$> vim /etc/nginx/sites-enabled/default
server {
  listen 80 default_server;
  root /var/www/html;
  index index.html index.htm index.nginx-debian.html;
  server_name _;
  location / {
      try_files $uri $uri/ =404;
   }
 # path to HLS application service
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias /dev/shm/hls;
            add_header Cache-Control no-cache;
            add_header 'Access-Control-Allow-Origin' '*';    
        }
  add_header 'Access-Control-Allow-Origin' '*'; # Hotfix pour diffusion depuis un autre serveur
}


POD


Il faut commencer par activer l'application live en ajoutant "live" dans THIRD_PARTY_APPS dans le fichier settings_local.py

Ensuite il faut se rendre dans l'administration de Pod, créer un bâtiment puis un diffuseur rattaché à ce bâtiment en précisant l'url de lecture du flux de direct.


Exemple :


Avec OBS, dans les paramètres, onglet Flux, je précise ces données :
    URL : rtmp://serveur.univ.fr/live
    Clé de stream : nico

Dans Pod, dans les paramètres de mon diffuseur, dans le champ URL, je vais préciser ceci : http://serveur.univ.fr/hls/nico.m3u8

Nous venons donc de créer un flux diffusé en direct accessible en HTML5, multibitrate et adaptatif, voici ce que contient le fichier nico.m3u8:
      #EXTM3U

      #EXT-X-VERSION:3

      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=288000

      nico_low/index.m3u8

      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1152000

      nico_high/index.m3u8

      #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=4096000

      nico_src/index.m3u8


  • No labels