Installation d'une nouvelle VM
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
}
/!\ Si votre frontal POD est en HTTPS il faut configurer Nginx sur le serveur live pour servir du HTTPS et non du HTTP
Sur votre instance de 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.
Mise en place du comptage des spectateurs (A partir de 2.7.0 et supérieur)
Pod inclu une fonction qui permet de compter les spectateurs sur un direct en temps réel.
Cette fonctionnalité doit être mise en place de la façon suivante :
Ajouter une tâche CRON périodique (chaque minute recommandé, mais il est possible d'augmenter ou de diminuer le temps et régler les settings sur pod en conséquence (voir les points suivants ...) :
ATTENTION : Il est possible que vous ayez à modifier cette commande suivant vos chemins d'installation de POD.
- Réglez le setting VIEWERS_ONLY_FOR_STAFF, celui-ci prend les valeurs True ou False et permet de définir si la liste des spectateurs (disponible en appuyant sur l'oeil) est accessible à tous ou uniquement aux membres du personnel.
- Réglez le setting HEARTBEAT_DELAY, celui ci permet de définir le délai entre lequel un client va remonter son "signal" au serveur. Il est par défaut fixé à 45 secondes.
Réglez le setting VIEW_EXPIRATION_DELAY, il permet de définir le délai maximum pour lequel une vue va encore considérée comme présente sur le direct.
A noter : Il est laissé la possibilité de modifier les délais pour pallier à d'éventuelles pertes de performances à cause de la remontée des vues. Si vous rencontrez des difficultés à ce niveau, n'hésitez pas à doubler les délais. Le comptage sera moins précis en temps réel mais vous gagnerez en nombre de requêtes.
Diffusion d'un flux video en direct (avec OBS) :
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
Il faut que le titre court soit le même que le flux/clé de stream (ici nico) de manière à ce que le status du live puisse être modifié par l'appel REST (exec_publish curl ...)
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