Stream to Multiple SRT Targets Using FFmpeg Tee

This article demonstrates how to configure and run an FFmpeg command to stream live video to multiple SRT (Secure Reliable Transport) destinations simultaneously using the tee muxer. Utilizing the tee protocol allows you to encode your input stream only once, saving significant CPU and system resources while distributing the stream to multiple endpoints.

The Basic FFmpeg Tee Command for SRT

To stream to multiple SRT targets, you must use the tee muxer format (-f tee) and map your encoded audio and video streams to multiple outputs separated by the pipe (|) character. Because SRT typically carries MPEG-TS streams, you must explicitly specify the format as mpegts for each target inside the tee option.

Here is the standard command template:

ffmpeg -re -i input.mp4 \
  -c:v libx264 -preset veryfast -b:v 3000k -g 60 \
  -c:a aac -b:a 128k \
  -f tee -map 0:v -map 0:a \
  "[f=mpegts]srt://target1.example.com:1234?mode=caller|[f=mpegts]srt://target2.example.com:5678?mode=caller"

Command Breakdown

Handling SRT Parameters and Escaping

SRT URLs often require additional parameters, such as latency, passphrase, or stream ID. When using these parameters inside the tee protocol, you must properly escape special characters (like ?, &, and =) to prevent FFmpeg or your command-line shell from misinterpreting them.

To pass multiple query parameters to an SRT target inside a tee command, escape the separator characters using backslashes:

ffmpeg -re -i input.mp4 \
  -c:v libx264 -b:v 4000k \
  -c:a aac -b:a 128k \
  -f tee -map 0:v -map 0:a \
  "[f=mpegts]srt://dest1.com:1234?mode=caller\&latency=200000|[f=mpegts]srt://dest2.com:5678?mode=caller\&latency=200000\&streamid=live/feed"

By using this configuration, FFmpeg will encode the input stream exactly once and duplicate the packets at the container level, allowing for efficient multi-destination SRT broadcasting.