Arborescence des pages

Vous regardez une version antérieure (v. /wiki/display/ES/Mise+en+place+du+Direct+Live) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 6) afficher la version suivante »

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

Le live se base sur le module 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 publier 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
                -c:v libx264 -preset veryfast -b:v 256k -maxrate 256k -bufsize 512k -vf "scale=480:-2,format=yuv420p" -g 60 -c:a aac -b:a 64k -ar 44100 -f flv rtmp://localhost/show/$name_low
                -c:v libx264 -preset veryfast -b:v 512k -maxrate 512k -bufsize 1024k -vf "scale=720:-2,format=yuv420p" -g 60 -c:a aac -b:a 96k -ar 44100 -f flv rtmp://localhost/show/$name_mid
                -c:v libx264 -preset veryfast -b:v 1024k -maxrate 1024k -bufsize 2048k -vf "scale=1280:-2,format=yuv420p" -g 60 -c:a aac -b:a 128k -ar 44100 -f flv rtmp://localhost/show/$name_high
            >/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=320000; # Low bitrate, sub-SD resolution
            hls_variant _high BANDWIDTH=640000; # High bitrate, higher-than-SD resolution
            hls_variant _src BANDWIDTH=1200000; # 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=320000

      nico_low/index.m3u8

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

      nico_high/index.m3u8

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

      nico_src/index.m3u8


  • Aucune étiquette