Aller au contenu

Chaînes et sources

Une source plus une destination. La source est une URL depuis laquelle Castmux tire le flux ; la destination est une adresse IPv4 et un port vers lesquels il pousse du MPEG-TS. Tout le reste sur la chaîne — moteur, profil de résolution, comportement à la demande, débit attendu — modifie la manière dont ce tuyau unique est exploité, pas ce qu’il transporte.

Les chaînes sont indépendantes. Chacune est supervisée, redémarrée et mesurée séparément, de sorte qu’un serveur d’origine hors service sur une chaîne ne perturbe pas les autres.

Sur IP, quatre types de sources sont pris en charge aujourd’hui : HLS, SRT, RTMP et MPEG-TS brut, ce dernier soit en multicast UDP, soit en HTTP. Le tableau ci-dessous indique ce qui est également pris en charge et ce qui est prévu.

SourceÉtatRemarques
HLSPris en chargePlaylist maître ou playlist média unique. Voir profils de résolution pour la manière dont un niveau est choisi.
SRTPris en chargeMode caller, entièrement configuré depuis l'URL. La latence est calculée automatiquement.
RTMPPris en chargeMoteur de remultiplexage uniquement. En général, un encodeur local qui pousse vers le réseau de l'appareil.
Multicast UDP (MPEG-TS)Pris en chargeRéception d'un flux multicast existant, comme la sortie d'une autre tête de réseau. Type de source mpegts avec une URL udp://. Voir sources MPEG-TS.
MPEG-TS sur HTTPPris en chargeUn transport stream brut sur HTTP, sans playlist. Type de source mpegts avec une URL http:// ou https://.
Multicast RTPPrévuTransport stream encapsulé dans RTP. Seul le MPEG-TS brut sur UDP est lu aujourd'hui. prévu
Caméras RTSPPrévuPour les flux du hall, de la chapelle et de vidéosurveillance. prévu
Entrée tuner DVB-S/S2PrévuServices satellite reçus par voie hertzienne plutôt que sur IP. Non disponible aujourd'hui : il n'existe aucune entrée tuner d'aucune sorte, n'achetez donc pas de carte tuner dans ce but. prévu
Entrée tuner DVB-TPrévuServices terrestres reçus par voie hertzienne. prévu
Entrée tuner DVB-CPrévuRéception de services depuis un réseau câblé plutôt que sur IP. prévu

Indiquez à la chaîne l’URL d’une playlist maître. Castmux lit l’échelle qu’elle annonce et sélectionne une variante à transmettre au moteur, selon le profil de résolution de la chaîne. Sans profil — la valeur par défaut, et celle de toutes les chaînes existantes — la playlist maître est transmise sans modification et c’est l’ordre du serveur d’origine qui décide.

La position de départ par rapport au direct est configurable. Démarrer plus loin en arrière dans la playlist apporte de la robustesse face à un serveur d’origine qui publie ses segments de façon irrégulière, au prix d’un retard plus important sur le direct et d’une première image plus lente après un changement de chaîne.

Les chaînes SRT fonctionnent en mode caller : Castmux se connecte au serveur d’origine. Toute la configuration réside dans l’URL, et les paramètres de requête suivants sont transmis au moteur :

streamid, passphrase, transtype, latency, rcvlatency, peerlatency, rcvbuf, sndbuf, maxbw, pbkeylen, payloadsize, tlpktdrop, linger.

Terminal window
srt://origin.example.net:9000?streamid=play/news&passphrase=••••••••&transtype=live

Castmux mesure le temps d’aller-retour vers l’hôte d’origine et fixe le budget de latence SRT à quatre fois le RTT mesuré, avec un plancher de 200 ms et un plafond de 4000 ms. Toute valeur de latence présente dans l’URL est remplacée.

Ce mécanisme existe parce que la valeur par défaut habituelle de 120 ms est inadaptée sur tout lien présentant une gigue réelle, et parce que la panne qui en résulte n’est jamais attribuée à la latence. Un budget sous-dimensionné ne coupe pas la chaîne : il provoque des artefacts intermittents — quelques secondes de macroblocs de temps en temps, à intervalles imprévisibles, sur une chaîne dont le tableau de bord est entièrement au vert. Des sites passent des semaines à incriminer l’encodeur, le switch et le téléviseur avant que quiconque soupçonne un paramètre de transport recopié depuis une autre installation au trajet plus court.

Le multiplicateur est la recommandation SRT usuelle : un récepteur doit pouvoir attendre une retransmission, qui coûte un aller-retour complet, avec de la marge pour une seconde tentative. Le plancher évite qu’un lien très court reçoive un budget trop faible pour absorber la moindre perte ; le plafond évite qu’une seule mauvaise mesure ajoute des secondes de retard à une chaîne.

Si vous préférez fixer la valeur vous-même, désactivez ce comportement avec overwrite_srt_latency: false dans la configuration globale : la latence indiquée dans l’URL est alors laissée telle quelle.

RTMP est pris en charge par le moteur de remultiplexage, et sert normalement pour un encodeur local situé sur le même réseau que l’appareil plutôt que pour un flux arrivant par Internet.

Le type de source mpegts accepte un transport stream qui arrive tel quel, sans playlist ni conteneur autour. Le schéma de l’URL détermine le transport :

# a multicast group, e.g. another headend's output
source:
type: mpegts
url: udp://239.20.0.5:1234?localaddr=192.168.10.4
# a continuous transport stream over HTTP
source:
type: mpegts
url: https://origin.example.net/news/mpegts

En UDP, la chaîne rejoint le groupe et lit les datagrammes de transport stream exactement comme ils arrivent. L’URL accepte trois paramètres facultatifs, identiques pour les deux moteurs :

  • localaddr est l’adresse locale sur laquelle recevoir le groupe. Renseignez-la sur un appareil doté de plusieurs interfaces, afin que l’abonnement parte par celle qui fait face à l’émetteur.
  • sources restreint la réception à un seul émetteur, pour le multicast spécifique à la source.
  • buffer_size est le tampon de réception du noyau, en octets. La valeur par défaut est généreuse, afin qu’un blocage de l’ordonnanceur ne fasse pas perdre de datagrammes.

En HTTP, la chaîne lit une réponse unique et sans fin, comme la sortie /mpegts d’un serveur de streaming. Si le serveur d’origine ferme la connexion, la chaîne redémarre, comme pour toute autre défaillance de source.

Quelques points diffèrent des autres types de sources :

  • Les profils de résolution ne s’appliquent pas. Un transport stream transporte un seul rendu fixe, et il n’y a pas d’échelle parmi laquelle choisir.
  • Une chaîne ne peut pas recevoir sa propre sortie. Une source udp:// identique à l’adresse et au port de destination de la chaîne est refusée à l’enregistrement. Sinon, le moteur ingérerait indéfiniment ce qu’il vient d’envoyer, pendant que l’indicateur de débit afficherait une chaîne en bonne santé. Lire le groupe d’une autre chaîne est autorisé, et constitue un moyen délibéré d’enchaîner une chaîne sur une autre.
  • Seul le transport stream brut est lu. Un flux multicast encapsulé dans RTP n’est pas encore pris en charge.

Une adresse IPv4 et un port. L’adresse peut être un groupe multicast, cas normal pour la distribution de télévision, ou une adresse unicast pour un récepteur unique ou un test.

En multicast, utilisez la plage à portée administrative 239.0.0.0/8. Elle est réservée exactement à cet usage — privé, local à l’organisation — si bien qu’aucune adresse choisie à l’intérieur ne peut entrer en conflit avec une attribution connue.

Une seule destination par chaîne aujourd’hui. Envoyer la même chaîne vers plusieurs groupes — par exemple un groupe multicast et une sonde unicast — nécessite une deuxième chaîne avec la même URL source. Plusieurs destinations par chaîne : prévu.

active

Indique si la chaîne est supervisée. Une chaîne inactive conserve sa configuration mais n’est jamais démarrée et ne produit aucune métrique.

force_always_on

Maintient la chaîne en fonctionnement, que quelqu’un la regarde ou non. Désactivé par défaut, ce qui signifie diffusion à la demande : la chaîne ne tourne que lorsqu’un spectateur est détecté sur son groupe. Activez-le pour les chaînes qui ne doivent jamais subir le délai de démarrage à froid lors d’un changement de chaîne. Voir Diffusion à la demande.

moteur

Remplace le choix global de moteur pour cette chaîne. Vide signifie hériter. Voir Moteurs de diffusion.

resolution_profile

Le niveau de l’échelle HLS à retenir. Vide signifie prendre la playlist maître sans modification. Ignoré pour SRT et RTMP, qui n’ont pas d’échelle. Voir Profils de résolution.

min_output_kbps

Le débit de sortie en dessous duquel la chaîne est considérée comme ne produisant rien, et donc comme devant être redémarrée.

Le nom de la chaîne n’est pas qu’une étiquette dans l’interface. Il devient le nom de service DVB transporté dans la SDT, c’est-à-dire ce qu’un téléviseur affiche dans sa liste de chaînes, et c’est l’étiquette attachée à chaque métrique produite par la chaîne.

C’est cette seconde conséquence qui surprend : renommer une chaîne renomme ses séries de métriques. L’historique ne suit pas le changement de nom, si bien qu’un tableau de bord ou une alerte basés sur l’ancien nom deviennent muets, et le graphique de la chaîne semble repartir de zéro. Choisissez les noms avant de construire vos tableaux de bord, et considérez un changement de nom comme une opération ayant un coût en aval plutôt que comme une retouche cosmétique.

Les chaînes sont identifiées par un identifiant entier. Cet identifiant apparaît dans le fichier de configuration, dans l’API HTTP et partout où une chaîne est référencée depuis l’extérieur.

Les identifiants sont actuellement réutilisés après une suppression. Si vous supprimez la chaîne 7 puis ajoutez une nouvelle chaîne, celle-ci peut recevoir l’identifiant 7. C’est une chaîne différente à tous égards pour un opérateur — nom, source et destination différents —, mais tout ce qui est indexé sur l’identifiant y voit une continuité qui n’existe pas.

Les conséquences pratiques sont à connaître avant de vous fier aux identifiants :

  • Tout ce qui stocke un état par chaîne rattaché à l’identifiant — un ordonnanceur externe, un appel API enregistré, un favori dans l’interface — peut se retrouver pointé vers la mauvaise chaîne après un cycle suppression-ajout.
  • Les navigateurs restaurent l’état des contrôles de formulaire lors d’un rechargement simple, indépendamment de ce que le serveur a rendu ; une chaîne nouvellement créée peut donc afficher brièvement un réglage hérité de la chaîne supprimée qui portait son identifiant. C’est le badge à côté du contrôle qui dit vrai.
  • En DVB-C, l’identité du service est dérivée de la position dans un multiplex plutôt que de l’identifiant de la chaîne ; réordonner ou supprimer une chaîne déplace donc les services qui l’entourent.

Des identifiants stables et non réutilisés ainsi qu’une identité de service figée : prévu. D’ici là, la règle sûre est la suivante : un identifiant désigne un emplacement, un nom désigne une chaîne.

Une licence peut contenir une liste de chaînes en plus d’une autorisation de diffuser. À chaque vérification de licence, l’appareil compare cette liste à ses propres chaînes. Chaque chaîne enregistre qui en est propriétaire (managed_by dans le fichier de configuration), et deux règles en découlent :

  • Une chaîne fournie par la licence appartient au serveur de licences. À chaque vérification, sa source, sa destination, son profil de résolution, son mode toujours actif et son état activé/désactivé sont mis à jour selon ce qu’envoie le serveur, de sorte qu’une chaîne qui change d’adresse est corrigée sans intervention sur site. Si le serveur cesse de la lister, elle est supprimée. L’interface web signale ces chaînes et refuse de les modifier ou de les supprimer, puisque la vérification suivante annulerait le changement.
  • Une chaîne que vous avez ajoutée vous-même n’est jamais modifiée. Le serveur ne la change ni ne la supprime jamais, même si la liste contient une chaîne du même nom. Seule exception : une chaîne que vous avez désactivée. Comme elle ne diffuse rien, une chaîne sous licence portant le même nom ou la même destination peut la reprendre. C’est ce qui permet de migrer un ancien appareil sans supprimer d’abord ses anciennes chaînes.

La licence fixe aussi un nombre maximal de chaînes pouvant tourner simultanément. Une chaîne sous licence au-delà de cette limite est ajoutée désactivée plutôt qu’abandonnée, si bien qu’augmenter l’offre plus tard revient à l’activer, sans la ressaisir. La limite s’applique aussi aux chaînes que vous ajoutez vous-même : une chaîne ajoutée alors que la limite est déjà atteinte arrive désactivée, avec un message qui en explique la raison.

Une chaîne sous licence qui enverrait vers un groupe déjà utilisé par une autre chaîne en cours de fonctionnement est refusée plutôt que d’être autorisée à entrer en collision ; il en va de même pour une chaîne envoyée par le serveur sans URL source ni destination. Les refus sont affichés dans l’interface web et journalisés, ce qui permet de distinguer « le serveur n’a rien envoyé » de « l’appareil a refusé ce qu’il a envoyé ».

Deux chaînes dans config.yaml — l’une en HLS avec un profil de résolution, l’autre en SRT avec un plancher de débit abaissé parce qu’il s’agit d’un service radio :

streams:
- id: 1
name: BBC One
description: Reception and lounge
active: true
source:
type: hls
url: https://origin.example.net/bbcone/master.m3u8
destination:
address: 239.1.1.10
port: 5000
# Televisions here are 720p panels; the origin lists 1080p first.
resolution_profile: hd
force_always_on: true
- id: 2
name: Classic FM
description: Audio only
active: true
source:
type: srt
url: srt://origin.example.net:9000?streamid=play/classicfm&transtype=live
destination:
address: 239.1.1.11
port: 5000
# Radio: well under the video-oriented global floor, so lower it or the
# channel is treated as silent and restarted forever.
min_output_kbps: 64
force_always_on: true

Aucune latency n’est indiquée dans l’URL SRT, car Castmux la déduit de l’aller-retour mesuré. Aucun engine n’est indiqué sur l’une ou l’autre chaîne, si bien que toutes deux héritent de la valeur globale par défaut.