RTMPKit
Publié le · Mis à jour le · 30 min
Quand vous lancez un live sur Twitch, YouTube ou Facebook, votre logiciel de diffusion envoie le flux audio et vidéo vers un serveur via un protocole créé par Macromedia en 2002, devenu le standard de facto du live streaming : RTMP. Real-Time Messaging Protocol.
Le principe : un client se connecte au serveur, effectue un handshake en trois étapes (C0/C1/C2), négocie les paramètres via des commandes AMF0, puis envoie les données audio et vidéo encapsulées dans des tags FLV, le tout multiplexé sur des chunk streams. Derrière cette apparente simplicité se cachent des subtilités — gestion du chunk size, des timestamps relatifs et absolus, des sequence headers pour chaque codec, et depuis 2023 l'Enhanced RTMP v2 qui ajoute la négociation FourCC pour les codecs modernes (HEVC, AV1, VP9, Opus).
En travaillant sur l'écosystème streaming d'Atelier Socle — HLSKit pour le HTTP Live Streaming, IcecastKit pour Icecast/SHOUTcast — la brique RTMP manquait. Pas un binding FFmpeg, pas une lib C bridgée — un vrai client publish Swift natif, avec la concurrence structurée de Swift 6.2, des presets pour les grandes plateformes, et un transport basé sur SwiftNIO.
J'ai cherché. Rien n'existait en Swift pur avec le support Enhanced RTMP v2. RTMPKit est née de ce besoin.
Avec la version 0.2.0 — RTMP Broadcast Platform — RTMPKit dépasse le cadre du simple client publish. La bibliothèque devient une plateforme de diffusion complète : 10 presets plateforme (Twitch, YouTube, Facebook, Kick, Instagram, TikTok, Rumble, LinkedIn, Trovo, Twitter/Periscope), un registre de plateformes programmatique, du bitrate adaptatif avec détection de congestion, la publication multi-destination simultanée, l'authentification RTMP (simple, token, Adobe challenge/response), l'auto-détection des codecs FLV, l'enregistrement de flux en FLV, le sondage de bande passante avec recommandations de qualité, le scoring de connexion avec analyse de tendance, les métadonnées dynamiques (texte, cue points, sous-titres), le support complet AMF3, l'export Prometheus et StatsD — et surtout un serveur ingest RTMP capable d'accepter des connexions entrantes avec validation de stream key, relay multi-destination, DVR, sécurité IP et rate limiting. 2243 tests, 94.01% de couverture.
La 0.3.0 durcit l'infrastructure et améliore la compatibilité serveur. Trois builders manuels de configuration codec sont ajoutés — buildAVCDecoderConfigurationRecord (SPS+PPS → ISO 14496-15 §5.3.3.1), buildHEVCDecoderConfigurationRecord (VPS+SPS+PPS → ISO 14496-15 §8.3.3.1) et buildAACAudioSpecificConfig (ISO 14496-3 §1.6.2.1) — pour les cas où vous construisez les tags FLV manuellement. L'interleaving audio/vidéo par timestamp (AVInterleaver) garantit l'ordre d'envoi correct des messages RTMP, évitant la désynchronisation A/V côté récepteur. Le layout byte0 de l'Enhanced RTMP v2 est corrigé ([isExHeader:1][FrameType:3][PacketType:4]), l'offset SPS HEVC saute correctement le header NALU de 2 octets, et les commandes onBWDone/onBWCheck sont ignorées pour la compatibilité SRS et Wowza. Côté performance, TCP_NODELAY est activé par défaut, les buffers TCP sont configurables, et la compression de chunk (fmt1/fmt2 par Adobe RTMP §5.3.1) réduit l'overhead sur les messages multi-chunk. Le monitoring qualité et ABR est déplacé hors du chemin critique d'envoi. 2243 tests, interop validée avec MediaMTX et SRS v6.
Ce que fait RTMPKit
RTMPKit est à la fois un client publish et un serveur ingest RTMP en Swift pur. Côté publication, elle gère l'intégralité du cycle de vie d'un stream live — connexion, handshake, négociation des codecs, envoi des frames audio et vidéo en FLV, statistiques temps réel, reconnexion automatique. Côté serveur, elle accepte les connexions entrantes, valide les stream keys, relaye vers plusieurs destinations, et enregistre en DVR. Le tout avec conformité Sendable stricte de bout en bout.
RTMP 1.0 complet — Handshake (C0/C1/C2), multiplexage chunk stream, commandes AMF0, packaging FLV
Enhanced RTMP v2 — Négociation FourCC pour HEVC, AV1, VP9, Opus, FLAC, AC-3 et E-AC-3 avec auto-détection depuis les fichiers FLV
Packaging FLV — Tags audio (sequence headers AAC, frames brutes), tags vidéo (NALUs AVC, keyframes), script data
10 presets plateforme — Configuration en une ligne pour Twitch, YouTube, Facebook, Kick, Instagram, TikTok, Rumble, LinkedIn, Trovo et Twitter/Periscope
Registre de plateformes — Découverte programmatique avec lookup insensible à la casse, filtrage TLS-required, et configuration dynamique
Bitrate adaptatif — Politiques ABR conservative, responsive et aggressive avec estimation de bande passante EWMA, tracking RTT, détection de congestion et frame dropping
Publication multi-destination — Streaming simultané vers N serveurs avec état par destination, isolation des pannes, ajout/suppression à chaud, et politiques de panne configurables
Authentification RTMP — Simple (query string), token avec expiration, et Adobe MD5 challenge/response (Wowza)
Auto-détection de codecs FLV — HEVC, AV1, VP9 et Opus détectés automatiquement depuis les fichiers FLV ; Enhanced RTMP v2 activé de manière transparente
Enregistrement de flux — Enregistrement des streams live en FLV avec segmentation, pause/reprise et limites de taille
Sondage de bande passante — Mesure de bande passante, jitter RTT, perte de paquets, et recommandations de preset de qualité sur 6 paliers
Scoring de qualité de connexion — Grades composites (excellent/good/fair/poor/critical) avec 5 dimensions pondérées et analyse de tendance
Métadonnées dynamiques —
@setDataFrame/onMetaDatapendant le streaming, texte temporisé, cue points avec paramètres riches, et sous-titres multi-standardsSupport AMF3 — Encodage et décodage AMF3 complet pour les 18 marqueurs de type avec 3 tables de référence (string/objet/traits)
Métriques Prometheus et StatsD — Export des métriques publisher et serveur vers les systèmes de monitoring avec snapshots périodiques ou à la demande
Serveur ingest RTMP — Acceptation de connexions RTMP entrantes avec validation de stream key (allow-list, closure), relay vers plusieurs destinations, et enregistrement DVR
Sécurité serveur — Blocklist/allowlist IP, bans temporaires, rate limiting par IP, et politiques de sécurité configurables (open/standard/strict)
Reconnexion automatique — Backoff exponentiel avec jitter configurable, limite de tentatives, et quatre presets (
.default,.aggressive,.conservative,.none)Monitoring temps réel — Bus d'événements
AsyncStream, ConnectionMonitor avec bitrate en fenêtre glissante, suivi des frames droppées, et mesure RTTInjection de transport — Remplacement du transport NIO par un mock pour tester sans serveur RTMP réel
Cross-platform — macOS 14+, iOS 17+, tvOS 17+, watchOS 10+, visionOS 1+, et Linux (Swift 6.2+)
Outil CLI —
rtmp-clipour publication, enregistrement, sondage, gestion de serveur, et diagnosticsSwift 6.2 strict concurrency — Actors pour les types stateful,
Sendablepartout,async/awaitde bout en bout, zéro@unchecked Sendableounonisolated(unsafe)Zéro dépendance core — Le target
RTMPKitdépend uniquement de SwiftNIO pour la couche transport. Aucune autre dépendance tierce
Quick start
Se connecter à Twitch, envoyer des données audio/vidéo, et se déconnecter proprement :
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 |
|---|---|
RTMP 1.0 | |
Enhanced RTMP v2 | |
AMF0 | |
AMF3 | |
FLV File Format |
Presets plateforme
RTMPKit fournit des presets pour 10 plateformes de streaming. Chaque preset configure automatiquement l'URL d'ingestion, le TLS, le chunk size et le support Enhanced RTMP — une seule ligne suffit pour être prêt à diffuser :
Registre de plateformes
Le StreamingPlatformRegistry permet de découvrir et configurer les 10 plateformes de manière programmatique. Lookup insensible à la casse, filtrage par TLS, et itération complète :
Configuration custom
Pour n'importe quel serveur RTMP, avec contrôle total sur le chunk size, Enhanced RTMP, la politique de reconnexion, et la configuration transport :
Enhanced RTMP v2
Enhanced RTMP est activé par défaut. Après la connexion, on peut vérifier quels codecs ont été négociés avec le serveur :
Construction des tags vidéo et audio enhanced pour les codecs modernes :
Auto-détection des codecs FLV
FLVCodecProbe inspecte un fichier FLV et identifie les codecs vidéo et audio utilisés. Si le fichier contient du HEVC, AV1, VP9 ou Opus, Enhanced RTMP v2 est activé de manière transparente sans intervention manuelle :
Publication multi-destination
Le MultiPublisher diffuse simultanément vers N plateformes avec un état indépendant par destination. Chaque connexion est isolée — si Twitch tombe, YouTube et Facebook continuent. On peut ajouter ou retirer des destinations pendant le streaming, et configurer des politiques de panne (par exemple : tout couper si 2 destinations échouent) :
Bitrate adaptatif
RTMPKit surveille les conditions réseau et ajuste les recommandations de bitrate en continu. Trois politiques ABR sont disponibles, chacune avec des seuils et des vitesses de réaction différents. Le frame dropping est géré de manière intelligente — les B-frames sont sacrifiées en premier, puis les P-frames, les I-frames ne sont jamais droppées :
Authentification RTMP
RTMPKit gère trois mécanismes d'authentification. L'authentification simple ajoute les credentials à l'URL. L'authentification par token supporte l'expiration avec une erreur typée si le token est expiré. L'authentification Adobe (utilisée par Wowza) implémente le challenge/response MD5 en deux rounds automatiquement :
Enregistrement de flux
Le StreamRecorder écrit le stream live en FLV sur le disque. La segmentation peut se faire par durée ou par taille totale. Le recorder supporte pause et reprise, et peut être piloté directement depuis le publisher :
Sondage de bande passante
Le BandwidthProbe mesure la qualité de connexion avant de lancer un stream. Il évalue la bande passante, le jitter RTT, la qualité du signal, et produit un résumé lisible. Le QualityPresetSelector convertit ces mesures en un preset de qualité adapté à la plateforme, sur une échelle de 6 paliers (360p30 à 1080p60) :
Scoring de qualité de connexion
Le ConnectionQualityMonitor calcule en continu un score de qualité composite basé sur 5 dimensions pondérées. Les scores sont émis via un AsyncStream et chaque rapport inclut une analyse de tendance (improving, stable, degrading) :
Métadonnées dynamiques
RTMPKit gère les métadonnées de stream en temps réel via @setDataFrame/onMetaData. Au-delà des métadonnées classiques (résolution, bitrate, framerate), la bibliothèque supporte le texte temporisé, les cue points avec paramètres riches (duration, sponsor…), et les sous-titres. Les champs custom survivent au roundtrip AMF0 :
Métriques Prometheus et StatsD
RTMPKit exporte les métriques de streaming au format Prometheus (text/OpenMetrics) et StatsD (datagrammes UDP). L'export peut être périodique ou à la demande via snapshot. Les labels (plateforme, environnement) sont configurables :
Serveur ingest RTMP
RTMPKit inclut un serveur ingest RTMP complet capable d'accepter les connexions entrantes de n'importe quel logiciel compatible RTMP (OBS, FFmpeg, Wirecast…). Le serveur valide les stream keys (par allow-list ou closure dynamique), peut relayer le flux vers plusieurs destinations en simultané, et enregistre en DVR. Un système de sécurité complet gère les blocklists IP, les bans temporaires, le rate limiting, et propose trois politiques préconfigurées (open, standard, strict) :
Le relay permet de retransmettre un flux reçu vers plusieurs destinations RTMP simultanément — transformant le serveur ingest en hub de redistribution :
Le DVR enregistre les flux entrants sur disque. Le mode auto-DVR enregistre automatiquement tous les streams reçus sans configuration par stream :
La sécurité du serveur s'appuie sur des blocklists/allowlists IP, des bans temporaires, et du rate limiting par IP. Trois politiques préconfigurées couvrent les cas d'usage les plus courants :
Monitoring temps réel
Le bus d'événements AsyncStream couvre l'ensemble des événements du publisher — changements d'état, messages serveur, statistiques, recommandations ABR, alertes qualité, événements d'enregistrement et erreurs :
Statistiques de connexion
Accès aux statistiques temps réel à tout moment — bytes envoyés, frames totales, bitrate courant, uptime, et taux de drop :
Reconnexion automatique
Quatre presets de reconnexion sont disponibles, plus les politiques entièrement custom avec jitter :
Injection de transport
Le transport réseau est injectable — on peut remplacer le transport NIO réel par un mock pour tester la logique de publication sans accès réseau :
Builders de configuration codec (0.3.0)
La 0.3.0 ajoute trois méthodes statiques pour construire manuellement les configuration records des codecs — utile quand vous alimentez RTMPKit depuis un pipeline de capture externe (par exemple swift-capture-kit) au lieu d'utiliser les helpers de haut niveau.
Interleaving et performances (0.3.0)
L'AVInterleaver réordonne les messages audio et vidéo par timestamp avant l'envoi sur le réseau. Un petit buffer (8 entrées par défaut) accumule les messages des deux types, et flush dès que les deux flux ont avancé au-delà du plus ancien timestamp. Résultat : les paquets arrivent dans l'ordre temporel correct côté récepteur, même si l'encodeur produit l'audio et la vidéo avec un décalage de quelques frames.
Côté transport, TCP_NODELAY est activé par défaut (configurable via RTMPConfiguration.tcpNoDelay) pour réduire la latence d'envoi. Les tailles de buffer TCP (receive et send) sont configurables. La compression de chunk RTMP (fmt1/fmt2 par Adobe RTMP Spec §5.3.1) réduit l'overhead des headers sur les messages multi-chunk — seuls les champs qui changent entre chunks consécutifs sont envoyés. Les timestamps non monotones sont gérés avec un fallback en fmt0 pour les séquences de B-frames.
Le monitoring de qualité et la logique ABR sont déplacés hors du chemin critique d'envoi (fire-and-forget), réduisant l'impact sur la latence des frames.
Architecture

La bibliothèque est organisée en 20 modules, du handshake bas niveau au serveur ingest complet :
Outil CLI
rtmp-cli couvre l'ensemble des cas d'usage en ligne de commande : publication avec presets ou multi-destination, enregistrement FLV, sondage de bande passante, gestion d'un serveur ingest local, test de connexion et diagnostic.
| Commande | Description |
|---|---|
publish | Streamer un fichier FLV vers un ou plusieurs serveurs RTMP |
test-connection | Tester la connectivité, le handshake et mesurer la latence |
info | Interroger les informations serveur, les capacités et le support Enhanced RTMP |
probe | Mesurer la bande passante et la qualité de connexion |
record | Publier un fichier FLV et enregistrer le stream sur disque |
server | Lancer un serveur ingest RTMP local |
Écosystème
RTMPKit 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 (cette bibliothèque) — Streaming RTMP
SRTKit — Streaming SRT
CaptureKit — Capture média unifiée
Liens
GitHub - atelier-socle/swift-rtmp-kit: Pure Swift RTMP broadcast platform — publish, ingest, adaptive bitrate, multi-destination, recording, AMF3, Enhanced RTMP (HEVC/AV1). Zero dependencies. macOS · iOS · Linux
Pure Swift RTMP broadcast platform — publish, ingest, adaptive bitrate, multi-destination, recording, AMF3, Enhanced RTMP (HEVC/AV1). Zero dependencie…