FFmpeg

How-to Broadcast using FFmpeg with RTMP

FFmpeg is a free open-source software project with command-line tools for handling video, audio, and other multimedia. It is common practice to use Ffmpeg in production workflows when broadcasting from a media file on disk.

Broadcasts are started using the ffmpeg command-line to forward a source using either RTMP or SRT broadcast contribution protocols which are then streamed as WebRTC for global real-time distribution.

See the official ffmpeg.org documentation for installation instructions and additional support.

👍

Getting Started

If you haven't already, begin by following the Getting Started tutorial to create a Dolby.io application and start your first broadcast.

General

Common Settings

ParameterDescription
-stream_loop -1Loop the video indefinitely
-vb 3000kVideo Bitrate setting of 3Kbps
-acodec aacAAC audio codec
-ac 2Audio channels for stereo
-ab 96000Audio Bitrate setting of 96Kbps
-ar 48000Audio Sample Rate of 48Kbps
-bf 0Disable bframes
-g 60Group of pictures (GOP) size
-f flvPackage flash video
-preset veryfastVideo encoding speed to compression ratio preset

RTMP

In order to broadcast with RTMP, you will need to have your RTMP publish path and RTMP publish stream name available. See the RTMP Broadcast Guide for details on how to retrieve these values.

The examples on the remainder of the page will reference these as environment variables: $RTMP_PUBLISH_PATH and $RTMP_PUBLISH_STREAM_NAME. You can replace these or set them as appropriate for the shell environment and operating system you are using.

How-to Publish an H.264 RTMP Video Stream

The Millicast platform supports AVC (H264) broadcast pass-through which is widely supported across platforms and browsers. Of note are two flags you should use:

  • -vcodec libx264 identifies the video codec
  • -vprofile baseline -level 3.0 is the H.264 profile and level for maximum decoding speed, frame size, and bit rate
ffmpeg -re -stream_loop -1 -i $VIDEO_FILE_PATH \
  -vcodec libx264 \
  -preset veryfast \
  -bf 0 -g 60 \
  -vb 3000k \
  -vprofile baseline \
  -level 3.0 \
  -acodec aac \
  -ab 96000 -ar 48000 -ac 2 \
  -strict experimental \
  -f flv \
  -rtmp_playpath $RTMP_PUBLISH_STREAM_NAME \
  -rtmp_live live $RTMP_PUBLISH_PATH

How-to Publish an H.265 RTMP Video Stream

The Millicast platform supports HEVC (H265) broadcast pass-through, but playback of this codec is not widely supported across all web browsers and devices. To view an HEVC stream, you should use Safari 17.2+ or the iOS Client SDK which provide decoding support.

To stream HEVC via RTMP you can use the libx265 codec and the flv packager:

YOUR_RTMP_PUBLISH_PATH_WITH_STREAM_NAME="rtmp://rtmp-auto.millicast.com:1935/v2/pub"+YOUR_RTMP_STREAM_NAME_AND_TOKEN

ffmpeg -re -stream_loop -1 -i demo.mp4 -c:v libx265 -x265-params bframes=0 \
-preset fast -crf 23 -b:v 1000k -maxrate 1000k -bufsize 2000k -c:a aac -b:a 96k \
-ar 44100 \
-f flv $YOUR_RTMP_PUBLISH_PATH_WITH_STREAM_NAME

How-to Publish an AV1 RTMP Video Stream

The Millicast platform supports AV1 broadcast pass-through with an RTMP-enhanced stream, but playback of this codec has varying support across web browsers and devices. To view an AV1 stream check your chosen platform/device's support.

To stream AV1 via RTMP you can use librav1e, SVT-av1 or libaom-av1 and the flv packager:

ffmpeg -re -stream_loop -1 -i demo.mp4 \
  -b:a 1M -b:v 1M \
  -c:v librav1e  -f flv \
  -rtmp_playpath $RTMP_PUBLISH_STREAM_NAME \
  -rtmp_live live $RTMP_PUBLISH_PATH

AV1 encoding can be quite processor-intensive and usually requires GPU-enabled hardware acceleration. For testing, we recommend including a few additional settings that can boost encoding speed:

-speed 10  -qp 63 -g 120 -keyint_min 120 -tile-columns 4 -tile-rows 2

🚧

AV1 Encoder Required

FFmpeg doesn't include an AV1 encoder with standard installs. You must install one separately by following FFmpeg's official AV1 installation guide.

How-to Publish an RTSP Video Stream

Support for Real-time Streaming Protocol (RTSP) can be done with ffmpeg by changing the input source. All of the other parameters are consistent with streaming a media file from disk.

ffmpeg -re -i rtsp://98.116.xx.xx:5545/axis-media/media.amp \
  -vcodec libx264  \
  -preset veryfast \
  -bf 0 -g 60 \
  -vb 3000k \
  -vprofile baseline \
  -level 3.0 \
  -acodec aac \
  -ab 96000 -ar 48000 -ac 2 \
  -strict experimental \
  -f flv \
  -rtmp_playpath $RTMP_PUBLISH_STREAM_NAME \
  -rtmp_live live $RTMP_PUBLISH_PATH

How-to Simulcast a Multi-Source MBR Video Stream

This example demonstrates sending the same video with multiple contribution layers. The &sourceId publishing parameter is used to distinguish each source while using &videoOnly so the audio is only sent with the main feed. Also see the Multi-Source Broadcasting for more about Multi-bitrate contribution.

ffmpeg -re -stream_loop -1 -i demo.mp4 \
  -c:v libx264 -preset medium -b:v:0 800k -maxrate:v:0 856k -bufsize:v:0 1200k -s:v:0 640x360 -profile:v:0 main -f flv "$RTMP_PUBLISH_PATH$RTMP_PUBLISH_STREAM_NAME&sourceId=1&simulcastId" \
  -c:v libx264 -preset medium -b:v:0 1200k -maxrate:v:0 1280k -bufsize:v:0 1600k -s:v:0 854x480 -profile:v:0 main -f flv "$RTMP_PUBLISH_PATH$RTMP_PUBLISH_STREAM_NAME&sourceId=2&simulcastId&videoOnly" \  
  -c:v libx264 -preset medium -b:v:0 2500k -maxrate:v:0 2600k -bufsize:v:0 3000k -s:v:0 1280x720 -profile:v:0 main -f flv "$RTMP_PUBLISH_PATH$RTMP_PUBLISH_STREAM_NAME&sourceId=3&simulcastId&videoOnly"

SRT

In order to broadcast with SRT, you will need to have your SRT publish path and SRT stream ID available. See the SRT Broadcast Guide for details on how to retrieve these values.

The examples on the remainder of the page will reference these as environment variables: $SRT_PUBLISH_PATH and $SRT_STREAM_ID. You can replace these or set them as appropriate for the shell environment and operating system you are using.

How-to Check if SRT is Supported in Your Installation

Some installations of ffmpeg may not have SRT available. This can be verified by running:

ffmpeg -buildconf | grep enable-libsrt

The output should show that --enable-libsrt is present.

How-to Simulcast a Redundant Ingest SRT Video Stream

This example demonstrates redundant ingest where a second publishing source is used to recover from a failed broadcast source. The &priority=100 publishing parameter is used to indicate which is the primary and which is the backup feed. The SRT URL must be URLencoded.

ffmpeg -nostdin -fflags +genpts -re -stream_loop -1 -i demo.mp4 \
  -map 0 -vcodec libx264 -c:a copy -b:a 128k -preset veryfast -bf 0 -g 60 -vb 4500k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D100" \
  -map 0 -vf scale=720:-2,setsar=1:1 -vcodec libx264 -an -preset veryfast -bf 0 -g 60 -vb 3000k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D100%26videoOnly%26sourceId%3D1" \
  -map 0 -vf scale=480:-2,setsar=1:1 -vcodec libx264 -an -preset veryfast -bf 0 -g 60 -vb 1500k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D100%26videoOnly%26sourceId%3D2"  

For the backup source, we'd use &priority=-100 and run it from a secondary piece of hardware or secondary network in case of failures. The rest of the command is identical otherwise.

ffmpeg -nostdin -fflags +genpts -re -stream_loop -1 -i demo.mp4 \
  -map 0 -vcodec libx264 -c:a copy -b:a 128k -preset veryfast -bf 0 -g 60 -vb 4500k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D-1" \
  -map 0 -vf scale=720:-2,setsar=1:1 -vcodec libx264 -an -preset veryfast -bf 0 -g 60 -vb 3000k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D-100%26videoOnly%26sourceId%3D1" \
  -map 0 -vf scale=480:-2,setsar=1:1 -vcodec libx264 -an -preset veryfast -bf 0 -g 60 -vb 1500k -vprofile baseline -level 3.0 -f mpegts "$SRT_URL%26priority%3D-100%26videoOnly%26sourceId%3D2"  

Troubleshooting

These examples were verified with ffmpeg version 6.0 on MacOS.

> ffmpeg -version
ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with Apple clang version 14.0.3 (clang-1403.0.22.14.1)

If you are using a different version or operating system please include these details when reporting any issues.

Stuttering video

If you experience stutter in your streaming video, make sure you are using the options:

-vprofile baseline -bf 0

You can also modify the -preset to adjust the compression speed to quality ratio.

Learn more

This guide covered broadcasting with ffmpeg. To test and view the stream you can use the dashboard or any of the other playback methods.

Continue exploring other software encoders and solutions you can use for broadcasting your real-time stream.