SRTKit
Publié le · 17 min
Quand vous diffusez un flux vidéo en direct sur un réseau instable — une contribution terrain, un lien satellite, une connexion 4G depuis un stade — le protocole de transport fait toute la différence. TCP est fiable mais ajoute de la latence, UDP est rapide mais perd des paquets sans prévenir. SRT (Secure Reliable Transport) combine le meilleur des deux : transport UDP avec fiabilité, basse latence, chiffrement AES, et correction d'erreur.
Créé par Haivision et devenu un standard ouvert via la SRT Alliance, SRT est aujourd'hui utilisé par les diffuseurs du monde entier — de la contribution live aux workflows broadcast, en passant par le cloud media. Le protocole gère le handshake en trois modes (Caller, Listener, Rendezvous), le chiffrement AES-CTR et AES-GCM de bout en bout, la correction d'erreur par XOR (FEC), le bonding de connexions pour le failover, et le contrôle de congestion adaptatif.
En travaillant sur l'écosystème streaming d'Atelier Socle — HLSKit pour le HTTP Live Streaming, IcecastKit pour Icecast/SHOUTcast, RTMPKit pour RTMP — la dernière brique manquante était SRT. Et pas un wrapper autour de libsrt en C — une implémentation Swift pure, depuis le transport UDP jusqu'au chiffrement AES, avec la concurrence structurée de Swift 6.2, zéro dépendance C, et une interopérabilité validée avec libsrt 1.5.4.
J'ai cherché. Rien n'existait en Swift pur. SRTKit est née de ce besoin.
La 0.2.0 ajoute le support IPv6 natif et corrige le format fil du StreamID — les octets doivent être inversés par blocs de 4 octets (chaque bloc est traité comme un UInt32 avec le premier octet de la chaîne en position LSB). Sans cette inversion, aucun serveur basé sur libsrt (OBS, FFmpeg, MediaMTX, srt-live-transmit) ne pouvait lire le StreamID correctement.
La 0.3.0 corrige trois problèmes fondamentaux de conformité au protocole. Le compteur de messageNumber des paquets de données — qui était fixé à 0 — est maintenant incrémenté sur 26 bits (2²⁶ − 1, valeur 0 réservée au FEC), résolvant le problème "opened but never publishing" avec MediaMTX. Le traitement des ACK est implémenté : le CIF est parsé pour extraire le dernier numéro de séquence acquitté, le RTT et la capacité du lien, les paquets acquittés sont libérés du buffer d'envoi, et un ACKACK est renvoyé en réponse. Enfin, l'Initial Sequence Number (ISN) est généré aléatoirement et indépendamment par direction (local pour l'envoi, peer pour la réception), conformément au draft IETF §4.3.
Ce que fait SRTKit
SRTKit est une implémentation Swift pure du protocole SRT. Elle couvre l'ensemble du protocole : connexion en trois modes, chiffrement AES, correction d'erreur FEC, bonding de connexion, contrôle de congestion, statistiques temps réel, enregistrement de flux, contrôle d'accès, et reconnexion automatique. Le tout avec conformité Sendable stricte de bout en bout. Ce n'est PAS un wrapper libsrt — c'est une implémentation complète depuis zéro.
Caller/Listener/Rendezvous — Trois modes de connexion pour toute topologie SRT avec négociation complète du handshake (induction, conclusion, échange de cookie), support IPv4 et IPv6 natif
Chiffrement AES-CTR + AES-GCM — Chiffrement de bout en bout avec dérivation de clé PBKDF2 (RFC 2898), key wrap RFC 3394, tailles configurables (128/192/256), et rotation automatique des clés avec pré-annonce
Forward Error Correction — FEC basé sur XOR en ligne, colonne et matrice avec layouts staircase/even, modes ARQ configurables (always, onreq, never), et parsing du format
SRTO_PACKETFILTERConnection Bonding — Broadcast (tous les liens), main/backup (failover automatique), et balancing (agrégation pondérée) avec déduplication de paquets et monitoring de stabilité
Contrôle de congestion — LiveCC (pacing de paquets), FileCC (AIMD avec slow start), AdaptiveCC (détection de patterns), architecture pluggable via le protocole
CongestionControllerPluginBandwidth Probing — Moteur de sondage par paliers avec presets quick/standard/thorough, génération automatique de configuration, et monitoring du bitrate avec hystérésis
TSBPD Timing — Time-Based Sender/Buffer/Delivery avec correction de dérive d'horloge, drop des paquets trop tardifs, et latence configurable
Statistiques temps réel — Métriques complètes (paquets, bytes, RTT, bande passante, buffers, congestion, FEC, chiffrement), scoring de qualité avec 5 métriques pondérées, exposition Prometheus et export StatsD
Enregistrement de flux — Enregistrement bufferisé avec rotation par taille/durée en format MPEG-TS ou raw
Contrôle d'accès — Contrôle d'accès basé sur StreamID au format
#!::avec parsing et génération (resource, mode, session, user, content type, clés custom)Reconnexion automatique — Backoff exponentiel avec jitter configurable et quatre presets (default, aggressive, conservative, disabled)
Multi-stream / Multi-caller — Routage de plusieurs flux sur un seul listener, gestion de plusieurs destinations avec contrôle enable/disable
Presets serveur — Configuration en une ligne pour AWS MediaConnect, Nimble Streamer, Haivision SRT Gateway, OBS Studio, Wowza, vMix, et SRT Live Server
Cross-platform — macOS 14+, iOS 17+, tvOS 17+, watchOS 10+, visionOS 1+, et Linux (Ubuntu 22.04+ avec Swift 6.2)
Outil CLI —
srt-clipour envoyer, recevoir, sonder, monitorer les statistiques, tester en loopback, et diagnostiquerSwift 6.2 strict concurrency — Actors pour les types stateful,
Sendablepartout,async/awaitde bout en bout, zéro@unchecked Sendableounonisolated(unsafe)Interop avec libsrt — Interopérabilité bidirectionnelle avec libsrt 1.5.4 et MediaMTX 1.16.3 validée pour les connexions chiffrées et non chiffrées, flux MPEG-TS H.264+AAC
Quick start
Se connecter à un listener SRT, envoyer des données, vérifier les statistiques, et se déconnecter :
Installation
Via Swift Package Manager, en ajoutant la dépendance dans votre Package.swift :
Puis dans le target concerné :
Plateformes supportées
| Plateforme | Version minimum |
|---|---|
macOS | 14+ |
iOS | 17+ |
tvOS | 17+ |
watchOS | 10+ |
visionOS | 1+ |
Linux | Swift 6.2 (Ubuntu 22.04+) |
Standards implémentés
| Standard | Référence |
|---|---|
SRT Protocol | |
SRT Handshake | |
AES Key Wrap | |
PBKDF2 | |
AES-CTR | |
AES-GCM |
Caller chiffré
Connexion chiffrée AES-256 en mode CTR avec passphrase :
Listener
Démarrer un listener SRT et accepter les connexions entrantes :
Configuration avec Builder
Le builder permet de construire une configuration complète avec mode, latence et chiffrement de manière fluide :
Presets
Six presets intégrés couvrent les cas d'usage courants. Chacun configure automatiquement la latence, le contrôle de congestion et les options socket :
Presets serveur
Configuration en une ligne pour les serveurs et logiciels de streaming courants. Chaque preset configure automatiquement la latence, le chiffrement, la taille des buffers, et le format StreamID pour une compatibilité optimale avec le produit cible :
Chiffrement AES-CTR
Chiffrement et déchiffrement au niveau paquet avec AES-CTR. La clé de session (SEK) et le sel sont utilisés pour chiffrer chaque payload indépendamment, en utilisant le numéro de séquence comme partie de l'IV :
Forward Error Correction
FEC basé sur XOR en ligne, colonne et matrice pour récupérer les paquets perdus sans retransmission. Layouts staircase et even, avec modes ARQ configurables :
Connection Bonding
Le bonding de connexion permet d'agréger ou de basculer entre plusieurs liens réseau. Trois modes sont disponibles : broadcast (envoi sur tous les liens), main/backup (failover automatique), et balancing (agrégation pondérée) :
Statistiques et scoring de qualité
Métriques complètes avec scoring de qualité automatique (0.0–1.0, cinq grades), export Prometheus et StatsD :
Contrôle d'accès
Contrôle d'accès basé sur StreamID au format #!:: pour le routage et l'authentification des flux :
Reconnexion automatique
SRTKit gère la reconnexion automatique avec backoff exponentiel. Quatre presets sont disponibles, plus les politiques custom avec jitter :
IPv6 et interopérabilité (0.2.0)
Le caller SRT bind désormais :: en IPv6 et 0.0.0.0 en IPv4, avec extraction correcte des adresses peer via SRTPeerAddress — un enum qui encapsule les deux familles d'adresses, y compris le format IPv4-mapped IPv6 (::ffff:a.b.c.d).
Le format fil du StreamID est corrigé pour correspondre à la spec SRT : chaque bloc de 4 octets est traité comme un UInt32 avec le premier octet de la chaîne en position LSB (least-significant byte). Cette inversion était requise pour l'interopérabilité avec toute implémentation basée sur libsrt — OBS, FFmpeg, MediaMTX, srt-live-transmit.
Conformité protocole et MediaMTX (0.3.0)
Trois corrections de conformité au protocole SRT rendent la connexion fiable avec les implémentations tierces.
Le compteur messageNumber des paquets de données est maintenant incrémenté sur 26 bits (champ de la spec SRT), avec wraparound à 0x03FFFFFF et valeur 0 réservée aux paquets de contrôle FEC. Avant, tous les paquets partaient avec messageNumber = 0, ce qui déclenchait la déduplication côté receiver.
Le traitement des ACK est implémenté : le CIF (Control Information Field) est parsé pour extraire le numéro de séquence acquitté, le RTT, la capacité du lien estimée et la taille de buffer disponible. Les paquets acquittés sont libérés du buffer d'envoi, et un ACKACK (type 0x0006) est renvoyé au peer.
L'Initial Sequence Number est généré aléatoirement par direction — un ISN local pour les paquets sortants, un ISN peer pour le buffer de réception — conformément au draft IETF SRT §4.3.
L'interopérabilité est validée avec MediaMTX 1.16.3 — un stream MPEG-TS H.264+AAC de 3 minutes publié depuis SRTKit caller vers MediaMTX listener, 0 erreurs, 0 buffer overflow. Les deux formats de StreamID sont supportés : le format SRT Access Control (#!::r=live/test,m=publish) utilisé par libsrt et Haivision, et le format court (publish:live/test) utilisé par MediaMTX.
Architecture

La bibliothèque est organisée en modules clairement séparés, chacun avec une responsabilité bien définie :
Outil CLI
srt-cli fournit l'envoi, la réception, le sondage, les statistiques, le test en loopback, et le diagnostic en ligne de commande avec affichage de progression et sortie structurée.
| Commande | Description |
|---|---|
send | Envoyer des données vers un listener SRT |
receive | Recevoir des données depuis un caller SRT |
probe | Sonder la bande passante disponible et obtenir des recommandations |
stats | Afficher les statistiques de connexion en temps réel |
test | Lancer un test de performance en loopback |
info | Afficher les informations de version et les fonctionnalités |
Écosystème
SRTKit fait partie de l'écosystème streaming d'Atelier Socle :
PodcastFeedMaker — Génération de flux RSS podcast
HLSKit — HTTP Live Streaming
IcecastKit — Streaming Icecast/SHOUTcast
RTMPKit — Streaming RTMP
CaptureKit — Capture média unifiée
SRTKit (cette bibliothèque) — Streaming SRT
Liens
GitHub - atelier-socle/swift-srt-kit: Pure Swift implementation of the SRT protocol. Caller, listener, rendezvous modes with AES encryption, FEC, connection bonding, congestion control, bandwidth probing, and real-time statistics. No C dependencies. macOS · iOS · tvOS · watchOS · visionOS · Linux.
Pure Swift implementation of the SRT protocol. Caller, listener, rendezvous modes with AES encryption, FEC, connection bonding, congestion control, ba…