FFmpeg et SRT : référence complète des commandes
Support SRT dans FFmpeg
FFmpeg supporte SRT via la bibliothèque libsrt. Ce support n’est pas toujours activé par défaut dans les paquets précompilés. Avant de commencer, vérifiez que votre installation est compatible.
Vérifier la version et le support SRT
ffmpeg -version | grep srt
Vous devez voir --enable-libsrt dans la ligne de configuration. Si ce n’est pas le cas, vous devrez recompiler FFmpeg ou utiliser un paquet qui inclut libsrt.
Pour vérifier la version exacte de libsrt liée :
ffmpeg -protocols 2>/dev/null | grep srt
La sortie doit afficher srt dans la liste des protocoles d’entrée et de sortie. FFmpeg 4.4+ est recommandé pour un support SRT stable. FFmpeg 5.0+ apporte des améliorations sur la gestion des options SRT.
Compiler FFmpeg avec libsrt
Si votre distribution ne fournit pas FFmpeg avec libsrt, compilez depuis les sources :
# Installer libsrt en premier
git clone https://github.com/Haivision/srt.git
cd srt
mkdir build && cd build
cmake .. -DENABLE_ENCRYPTION=ON
make -j$(nproc)
sudo make install
# Compiler FFmpeg avec libsrt
git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --enable-libsrt --enable-gpl --enable-openssl
make -j$(nproc)
sudo make install
Mode listener
En mode listener, FFmpeg ouvre un port et attend qu’un caller s’y connecte. C’est utile quand FFmpeg joue le rôle de serveur de réception.
Recevoir un flux SRT en listener
ffmpeg -i "srt://:9000?mode=listener" \
-c copy output.ts
FFmpeg écoute sur le port 9000 et enregistre le flux entrant sans réencodage. Le flux doit être encapsulé en MPEG-TS côté émetteur.
Listener avec latence personnalisée
ffmpeg -i "srt://:9000?mode=listener&latency=500000" \
-c copy output.ts
La latence est exprimée en microsecondes dans les URL SRT de FFmpeg. 500 ms = 500000.
Listener qui retransmet vers un lecteur
ffmpeg -i "srt://:9000?mode=listener&latency=300000" \
-c copy -f mpegts udp://127.0.0.1:5000
Ce schéma est courant en régie : recevoir un flux SRT distant et le redistribuer localement en UDP multicast ou unicast pour les lecteurs et mélangeurs vidéo.
Mode caller
Le mode caller connecte FFmpeg vers un listener distant. C’est le mode le plus fréquent quand FFmpeg pousse un flux vers un serveur ou une passerelle SRT.
Envoyer un flux en mode caller
ffmpeg -re -i input.ts \
-c copy -f mpegts \
"srt://serveur-distant:9000?mode=caller&latency=500000"
Le flag -re lit le fichier source au débit réel. Sans ce flag, FFmpeg envoie les données aussi vite que possible, ce qui provoque un débordement du tampon SRT.
Envoyer une source live (caméra, carte de capture)
ffmpeg -f v4l2 -i /dev/video0 \
-f alsa -i hw:0 \
-c:v libx264 -preset ultrafast -tune zerolatency -b:v 5000k \
-c:a aac -b:a 128k \
-g 60 -keyint_min 60 \
-f mpegts \
"srt://serveur:9000?mode=caller&latency=500000"
Sur macOS, remplacez -f v4l2 par -f avfoundation et -f alsa par le périphérique audio CoreAudio correspondant.
Chiffrement
Le chiffrement SRT utilise AES et se configure directement dans l’URL. Les deux côtés (listener et caller) doivent utiliser la même passphrase et la même longueur de clé. Pour une explication détaillée du fonctionnement du chiffrement, consultez la page Configuration du chiffrement SRT.
Listener chiffré
ffmpeg -i "srt://:9000?mode=listener&passphrase=MaPassphrase2026Secure&pbkeylen=32" \
-c copy output.ts
Caller chiffré
ffmpeg -re -i input.ts \
-c copy -f mpegts \
"srt://serveur:9000?mode=caller&passphrase=MaPassphrase2026Secure&pbkeylen=32"
Les valeurs de pbkeylen :
16pour AES-12824pour AES-19232pour AES-256 (recommandé)
La passphrase doit comporter entre 10 et 79 caractères. Utilisez openssl rand -base64 32 pour en générer une robuste.
Transcodage avec SRT
Le transcodage est nécessaire quand le format source ne correspond pas aux exigences de la destination. FFmpeg peut recevoir en SRT, transcoder à la volée, et réémettre en SRT ou vers un autre protocole.
Recevoir en SRT, transcoder, réémettre en SRT
ffmpeg -i "srt://:9000?mode=listener&latency=500000" \
-c:v libx264 -preset fast -b:v 4000k -g 60 \
-c:a aac -b:a 128k \
-f mpegts \
"srt://destination:9001?mode=caller&latency=500000"
Transcodage avec accélération matérielle (Intel QSV)
ffmpeg -hwaccel qsv -i "srt://:9000?mode=listener" \
-c:v h264_qsv -b:v 4000k -g 60 \
-c:a copy \
-f mpegts \
"srt://destination:9001?mode=caller&latency=300000"
L’accélération matérielle réduit considérablement la charge CPU. Sur un Intel de 10e génération ou ultérieur, le transcodage d’un flux 1080p30 consomme moins de 5 % du CPU avec QSV, contre 40-60 % en logiciel.
Redimensionnement pendant le transcodage
ffmpeg -i "srt://:9000?mode=listener" \
-vf "scale=1280:720" \
-c:v libx264 -preset fast -b:v 2500k -g 60 \
-c:a aac -b:a 96k \
-f mpegts \
"srt://destination:9001?mode=caller"
Relais RTMP vers SRT
Ce cas d’usage est omniprésent : recevoir un flux RTMP d’un encodeur ancien (ou d’une plateforme qui ne supporte que RTMP) et le relayer en SRT vers une infrastructure moderne. Pour une vue d’ensemble de cette transition, consultez le guide RTMP vers SRT.
Conversion RTMP vers SRT
ffmpeg -listen 1 -i rtmp://0.0.0.0:1935/live/stream \
-c copy -f mpegts \
"srt://serveur-srt:9000?mode=caller&latency=500000&passphrase=SecureKey2026&pbkeylen=32"
Le flag -listen 1 met FFmpeg en mode serveur RTMP. Le flux est recopié sans réencodage (-c copy) et réemballé de FLV (conteneur RTMP) vers MPEG-TS (conteneur SRT).
Relais SRT vers RTMP (pour les plateformes de diffusion)
ffmpeg -i "srt://:9000?mode=listener&latency=300000" \
-c copy -f flv \
"rtmp://a.rtmp.youtube.com/live2/votre-cle-stream"
L’opération inverse : recevoir un flux SRT et le pousser vers YouTube, Twitch ou toute autre plateforme RTMP. Pas de réencodage nécessaire si le codec source est compatible (H.264 + AAC).
SRT vers HLS
La conversion SRT vers HLS est le schéma classique pour la distribution web. FFmpeg génère les segments HLS et le manifest .m3u8 à partir d’un flux SRT entrant.
Conversion basique SRT vers HLS
ffmpeg -i "srt://:9000?mode=listener&latency=500000" \
-c copy \
-f hls -hls_time 4 -hls_list_size 5 -hls_flags delete_segments \
/var/www/html/live/stream.m3u8
HLS adaptatif multi-débit depuis SRT
ffmpeg -i "srt://:9000?mode=listener" \
-filter_complex "[0:v]split=3[v1][v2][v3]; \
[v1]scale=1920:1080[v1out]; \
[v2]scale=1280:720[v2out]; \
[v3]scale=854:480[v3out]" \
-map "[v1out]" -c:v:0 libx264 -b:v:0 5000k -g 60 \
-map "[v2out]" -c:v:1 libx264 -b:v:1 2500k -g 60 \
-map "[v3out]" -c:v:2 libx264 -b:v:2 1000k -g 60 \
-map 0:a -c:a aac -b:a 128k \
-f hls -hls_time 4 -hls_list_size 5 \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:0 v:2,a:0" \
/var/www/html/live/stream_%v.m3u8
Ce pipeline produit trois variantes (1080p, 720p, 480p) avec un manifest maître HLS. Pour approfondir le streaming adaptatif, consultez le guide SRT et protocoles.
Multi-sortie avec tee
Le muxer tee de FFmpeg permet d’envoyer un même flux vers plusieurs destinations simultanément, sans dupliquer le décodage ou l’encodage.
Deux sorties SRT depuis une seule source
ffmpeg -i "srt://:9000?mode=listener" \
-c copy -f tee \
"[f=mpegts]srt://dest1:9001?mode=caller|[f=mpegts]srt://dest2:9002?mode=caller"
SRT + RTMP + enregistrement local
ffmpeg -i "srt://:9000?mode=listener" \
-c copy -f tee \
"[f=mpegts]srt://prod-server:9001?mode=caller|\
[f=flv]rtmp://a.rtmp.youtube.com/live2/cle-stream|\
[f=mpegts]/recordings/archive_$(date +%Y%m%d_%H%M%S).ts"
Cette commande reçoit un flux SRT et le distribue vers un serveur de production en SRT, YouTube en RTMP, et un fichier local en MPEG-TS. Vajra Cast offre cette fonctionnalité de multi-destination nativement via son interface, sans ligne de commande.
Paramètres de latence
La latence est le paramètre le plus déterminant pour la qualité du transport SRT. Un tampon trop court empêche la récupération des paquets perdus. Un tampon trop long ajoute un délai inutile. Pour un réglage fin, consultez le guide d’optimisation de la latence SRT.
Paramètres recommandés par scénario
# LAN, même réseau local
"srt://:9000?latency=40000"
# Même ville, fibre
"srt://:9000?latency=200000"
# Même continent, internet
"srt://:9000?latency=500000"
# Intercontinental
"srt://:9000?latency=1000000"
# Cellulaire, satellite, SRTLA
"srt://:9000?latency=2000000"
Contrôle de la bande passante
# Limiter la bande passante totale à 10 Mbps
"srt://:9000?maxbw=10000000"
# Surcharge de bande passante pour les retransmissions (25% par défaut)
"srt://:9000?oheadbw=30"
# Mode automatique (SRT estime la bande passante)
"srt://:9000?maxbw=0"
Timeout de connexion
# Timeout de connexion à 5 secondes (en microsecondes)
"srt://serveur:9000?mode=caller&connect_timeout=5000000"
Monitoring avec ffprobe
ffprobe permet d’inspecter un flux SRT sans le consommer ni le modifier. C’est l’outil de diagnostic de première ligne.
Analyser un flux SRT
ffprobe -i "srt://serveur:9000?mode=caller" \
-show_format -show_streams -print_format json
Cette commande affiche le codec vidéo et audio, la résolution, le débit, le nombre de programmes MPEG-TS et les métadonnées du flux.
Vérifier le débit en continu
ffprobe -i "srt://serveur:9000?mode=caller" \
-show_entries frame=pkt_size,pkt_pts_time \
-select_streams v:0 -of csv=p=0 2>/dev/null | \
awk -F',' '{sum+=$1; count++} END {printf "Bitrate moyen: %.2f Mbps\n", (sum*8)/(count*0.033)/1000000}'
Vérifier la disponibilité d’un listener
ffprobe -v error -i "srt://serveur:9000?mode=caller&connect_timeout=3000000" \
-show_entries stream=codec_name -of csv=p=0 2>&1
Si la commande renvoie un codec (par exemple h264), le listener est actif et envoie des données. Si elle échoue après le timeout, le listener est injoignable ou inactif.
Connexion à Vajra Cast
Vajra Cast fonctionne nativement comme listener et caller SRT. FFmpeg s’y connecte comme à n’importe quel endpoint SRT.
Pousser un flux vers Vajra Cast
ffmpeg -re -i source.ts \
-c copy -f mpegts \
"srt://vajracast.example.com:9000?mode=caller&latency=500000&passphrase=VotrePassphrase&pbkeylen=32"
Vajra Cast accepte le flux et permet ensuite de le router vers des sorties multiples (SRT, RTMP, HLS) depuis son interface web, avec surveillance des métriques SRT en temps réel.
Tirer un flux depuis Vajra Cast
ffmpeg -i "srt://vajracast.example.com:9001?mode=caller&latency=300000" \
-c copy output.ts
Si Vajra Cast est configuré en listener sur un port de sortie, FFmpeg se connecte en caller pour récupérer le flux. Ce mode est pratique pour l’enregistrement distant ou l’alimentation d’un workflow de post-production.
Relayer vers Vajra Cast depuis un encodeur RTMP
ffmpeg -listen 1 -i rtmp://0.0.0.0:1935/live/stream \
-c copy -f mpegts \
"srt://vajracast.example.com:9000?mode=caller&passphrase=SecureKey&pbkeylen=32"
Cette configuration fait office de convertisseur de protocole local. Un encodeur ancien envoie du RTMP, FFmpeg le convertit et le pousse en SRT chiffré vers Vajra Cast.
Dépannage
”Protocol not found” ou “srt not found”
FFmpeg n’a pas été compilé avec libsrt. Vérifiez avec ffmpeg -protocols | grep srt. Si absent, recompilez FFmpeg avec --enable-libsrt.
”Connection rejected” côté caller
Causes possibles :
- Le listener n’est pas démarré sur le port ciblé
- Le pare-feu bloque le trafic UDP sur ce port
- La passphrase ou
pbkeylenne correspondent pas entre caller et listener
Test rapide de connectivité UDP :
# Sur le serveur listener
nc -u -l 9000
# Depuis le caller
echo "test" | nc -u serveur 9000
Flux qui se connecte mais vidéo corrompue
Cause fréquente : le conteneur de sortie n’est pas MPEG-TS. SRT transporte du MPEG-TS, pas du FLV ni du MP4. Assurez-vous d’utiliser -f mpegts dans votre commande FFmpeg.
Latence réelle supérieure à la valeur configurée
C’est un comportement normal. Le paramètre latency contrôle uniquement le tampon de réception SRT. La latence totale inclut aussi le temps d’encodage, le tampon de gigue et le décodage. Pour la réduire, ajoutez -tune zerolatency à l’encodeur et réduisez le buffer du décodeur.
Perte de paquets élevée malgré un bon réseau
Vérifiez le paramètre maxbw. S’il est trop bas, SRT n’a pas assez de bande passante pour les retransmissions. Passez à maxbw=0 pour laisser SRT estimer automatiquement la bande passante nécessaire.
Le flux s’interrompt toutes les quelques secondes
Cause probable : absence du flag -re lors de la lecture d’un fichier. FFmpeg envoie les données à vitesse maximale, le tampon SRT déborde et le flux se coupe. Ajoutez -re avant -i pour lire au débit réel.
Dérive audio/vidéo sur les longs flux
Ajoutez -async 1 ou -fflags +genpts pour forcer la régénération des timestamps :
ffmpeg -fflags +genpts -i "srt://:9000?mode=listener" \
-c copy -f mpegts \
"srt://destination:9001?mode=caller"
FFmpeg reste l’outil de référence pour le traitement SRT en ligne de commande. Pour les workflows de production qui nécessitent une interface graphique, du monitoring en temps réel et du routage multi-destination sans scripts, Vajra Cast remplace avantageusement les chaînes FFmpeg complexes par une configuration visuelle.