RTMPKit

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/onMetaData pendant le streaming, texte temporisé, cue points avec paramètres riches, et sous-titres multi-standards

  • Support 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 RTT

  • Injection 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 CLIrtmp-cli pour publication, enregistrement, sondage, gestion de serveur, et diagnostics

  • Swift 6.2 strict concurrency — Actors pour les types stateful, Sendable partout, async/await de bout en bout, zéro @unchecked Sendable ou nonisolated(unsafe)

  • Zéro dépendance core — Le target RTMPKit dé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

PlateformeVersion minimum

macOS

14+

iOS

17+

tvOS

17+

watchOS

10+

visionOS

1+

Linux

Swift 6.2 (Ubuntu 22.04+)

Standards implémentés

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

Architecture de RTMPKit — 20 modules : AdaptiveBitrate, AMF, Authentication, Chunk, Configuration, Enhanced, Extensions, FLV, Handshake, Message, Metadata, Metrics, Monitoring, MultiPublisher, Probing, Publisher, QualityScore, Recording, Server, Transport
Vue d'ensemble de l'architecture modulaire de RTMPKit (20 modules)

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.

CommandeDescription

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

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…

GitHub