Identification

Streaming live avec crtmpserver


Crtmpserver est un serveur de streaming haute performance écrit en C++ ; la recette qui suit explique les étapes à suivre pour mettre en ligne un service de streaming personnel basé sur cet outil dans un environnement GNU/Linux Debian.

Postulat de départ

Nous souhaitons disposer d'un service de streaming personnel capable de réceptionner un flux vidéo émit en direct et de le distribuer à des clients disposants de l'adresse du flux.

Prérequis

Les prérequis sont les suivants :

  • Un serveur GNU/Linux Debian opérationnel,
  • Un une bande passante réseau suffisante,
  • Une connexion ADSL ayant un débit montant de 1000 kbit/s minimum,
  • Le logiciel Open Broadcaster (création du flux vidéo),
  • ​Le logiciel VLC (réception du flux vidéo).

Installer crtmpserver

Sur un serveur Debian l'installation du service se réalise de manière classique via la commande suivante :

# apt-get install crtmpserver

Les fichiers de configuration se trouvent dans le dossier /etc/crtmpserver/.

Les logs se trouvent dans le dossier  /var/log/crtmpserver/.

Le contrôle du serveur s'effectue à l'aide de la commande suivante :

# service crtmpserver {start|stop|status|restart}

Configurer le pare-feu

Pour permettre au service que nous mettons en place de fonctionner correctement il faut autoriser les ports suivants sur le pare-feu du serveur :

  • Port n°1935 en TCP pour le flux vidéo entrant,
  • Port n°554 en TCP pour le flux vidéo sortant.

Ces numéros de ports sont ceux par défaut et vous pouvez les modifier à loisir.

Configuration générale

La première étape de configuration consiste à désactiver les applications crtmpserver dont nous n'aurons pas besoin. La liste des applications lancées par le serveurs se trouve dans le fichier /etc/crtmpserver/enabled_applications.conf.

Nous utiliserons uniquement les applications appselector et flvplayback. Après modification du fichier, il devrait être semblable à celui-ci :

######
# This configuration file contains list of application which need to be run.
appselector
flvplayback

Note : Avant toute édition d'un fichier de configuration, pensez à faire une copie de sauvegarde.

La seconde étape consiste à éditer le fichier contenant la configuration nécessaire à la réception du flux vidéo qui sera transmit au serveur. Ce fichier est le suivant : /etc/crtmpserver/applications/appselector.lua.

Le seul acceptor utile dans notre cas est celui concernant le trafic entrant de type RTMP (Real Time Messaging Protocol). Il convient donc de commenter/retirer les autres acceptors.

Une fois les modifications effectuées, le fichier appselector.lua devrait ressembler à celui-ci :

application =
{
  name = "appselector",
  description = "Application for selecting the rest of the applications",
  protocol = "dynamiclinklibrary",
  validateHandshake = true,
  default = true,
  acceptors =
  {
    {
      ip = "0.0.0.0",
      port = 1935,
      protocol = "inboundRtmp"
    },
  }
}

Pour que les modifications soient prises en compte il faut redémarrer le service :

# service crtmpserver restart

Il est possible de vérifier que le démarrage s'est bien passé à l'aide de la commande suivante :

# service crtmpserver status

Diffuser en direct

La configuration générale étant en place, il est temps de s'attaquer à la configuration permettant de diffuser notre webcam en direct.

Configurer le serveur

Le fichier /etc/crtmpserver/applications/flvplayback.lua contient la configuration nécessaire pour que les clients puissent lire le flux vidéo récupéré par le serveur.

Dans ce fichier nous paramétrerons un seul acceptor de type inboundRtsp et nous supprimons l'ensemble des externalStreams, inutiles dans notre cas. Nous en profitons également pour autoriser la connexion des agents de type Open Broadcaster et pour demander une authentification pour les flux entrants et sortants :

application=
{
  description="Live Playback",
  name="flvplayback",
  protocol="dynamiclinklibrary",
  mediaFolder="/var/lib/crtmpserver/mediaFolder",
  aliases=
  {
    "live"
  },
  acceptors =
  {
    {
      ip="0.0.0.0",
      port=554,
      protocol="inboundRtsp"
    },
  },
  externalStreams =
  {
  },
  validateHandshake=true,
  keyframeSeek=true,
  seekGranularity=1.5, --in seconds, between 0.1 and 600
  clientSideBuffer=12, --in seconds, between 5 and 30
  --generateMetaFiles=true, --this will generate seek/meta files on application startup
  --renameBadFiles=false,
  --enableCheckBandwidth=true,
  authentication=
  {
    rtmp={
      type="adobe",
      -- Agents autorisés à s'authentifier
      encoderAgents=
      {
        "FMLE/3.0 (compatible; FMSc/1.0)",
        "FMLE/3.0 (compatible; obs-studio/0.13.2-3; FMSc/1.0)",
      },
      usersFile="/etc/crtmpserver/conf.d/users.lua"
    },
    rtsp={
      usersFile="/etc/crtmpserver/conf.d/users.lua"
    }
  },
}

ATTENTION : L'encoder agent envoyé par Open Broadcaster change à chaque montée en version du logiciel, ce qui occasionne un refus de connexion de la part de crtmpserver. A l'heure ou j'écris ces lignes, il n'est pas possible de modifier simplement le user agent dans OBS. Si votre serveur semble refuser la connexion à OBS, consultez ses logs et assurez vous qu'il attend le bon encoder agent. La commande suivante fait remonter un problème d'encoder agent du log :

# sudo cat /var/log/crtmpserver/main.log.{xxxx} | grep agent
...
This agent is not on the list of allowed encoders: `FMLE/3.0 (compatible; obs-studio/0.13.4-1; FMSc/1.0)`

La gestion des utilisateurs s'effectue à l'aide du fichier /etc/crtmpserver/conf.d/users.lua dans lequel nous n'allons déclarer que deux utilisateurs (noms et mdps à adapter) :

users=
{
  user1="pass1",
  user2="pass2",
}

realms=
{
  {
    name="My realm...",
    method="Digest",
    users={
      "user1",
      "user2",
    },
  },
  {
    name="My second realm...",
    method="Basic",
    users={
      "user1",
      "user2",
    },
  }
}

Une fois l'ensemble de la configuration effectuée, il faut redémarrer le service afin que les modifications soient prises en compte :

# service crtmpserver restart

Configurer Open Broadcaster

A ce stade le serveur doit être opérationnel ; la configuration à saisir dans Open Broadcaster pour commencer à diffuser un flux est la suivante (Menu Fichier > Paramètres > Flux) :

  • Type de diffusion : Serveur de Streaming Personnalisé
  • URL : rtmp://{url_du_serveur}:{port}/flvplayback
  • Clé de stream : live
  • Nom d'utilisateur : celui de votre fichier de configuration
  • Mot de passe : celui de votre fichier de configuration

Tester le flux vidéo

Le logiciel VLC permet la lecture d'un flux réseau. L'ouverture d'un flux s'effectue via le menu Média > Ouvrir un flux réseau… ( ou Ctrl-n).

Dans le champ concernant l'URL réseau à ouvrir il suffit de saisir l'URL suivante (à personnaliser) :

rtsp://{user}:{pass}@{url_du_serveur}:{port}/flvplayback/live