Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Run FFmpeg under a systemd service with Restart=on-failure and a measured RestartSec= delay. If FFmpeg exits abnormally, systemd can launch it again; if it stays running while the output connection fails, a process restart alone may not help. For a more resilient setup, match the recovery method to the failure layer: protocol reconnect options for supported inputs, FFmpeg’s FIFO muxer for some output interruptions, and systemd for process exits.

These measures do not fix a bad YouTube stream key, rejected ingest, persistent network outage, or incompatible encoder settings. The example below is a starting point to adapt and test—not a guaranteed drop-in configuration.

What systemd can—and cannot—recover

systemd supervises the FFmpeg process. With Restart=on-failure, it can start the service again after an abnormal exit, then wait for the configured restart delay. Its service manual recommends this policy for long-running services. Restart attempts are still subject to systemd start-rate limiting, whose behavior and configuration details can vary by systemd version. Read the systemd service manual.

A restart is not the same as repairing a stream. If FFmpeg exits because the stream key is invalid, YouTube rejects the ingest, or the command uses unsupported settings, systemd may repeatedly relaunch the same failing command. If FFmpeg remains alive but its output is disconnected, systemd may not restart it at all. Choose recovery options for the layer that is failing.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
CanaKit Raspberry Pi 4 4GB Starter PRO Kit - 4GB RAM
  • Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM)
  • Includes Pre-Loaded 32GB EVO+ Micro SD Card (Class 10), USB MicroSD Card Reader
  • CanaKit Premium High-Gloss Raspberry Pi 4 Case with Integrated Fan Mount, CanaKit Low Noise Bearing System Fan
  • CanaKit 3.5A USB-C Raspberry Pi 4 Power Supply (US Plug) with Noise Filter, Set of Heat Sinks, Display Cable - 6 foot (Supports up to 4K60p)
  • CanaKit USB-C PiSwitch (On/Off Power Switch for Raspberry Pi 4)

Create a systemd service for FFmpeg

This schematic unit illustrates the service structure. Replace the input path, FFmpeg arguments, and destination with values for your setup. The example destination is deliberately invalid; do not use it to publish a stream.

[Unit]
Description=FFmpeg YouTube stream
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/ffmpeg -re -i /path/to/input -c:v libx264 -c:a aac -f flv rtmps://example.invalid/live/STREAM_KEY
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
  1. Confirm the local tools and paths. Check where FFmpeg is installed and which systemd version the machine uses. The example assumes /usr/bin/ffmpeg; use the actual executable path. Validate option placement against the installed FFmpeg build and its documentation.
  2. Save a unit file. Create a service unit such as /etc/systemd/system/ffmpeg-youtube.service and adapt the example. Wants=network-online.target and After=network-online.target express a dependency and ordering request; they do not guarantee that the internet, YouTube ingest, or a usable route is available.
  3. Protect the stream key. Do not put a real key in a broadly readable unit file or expose it in logs. Use a suitably protected configuration or environment mechanism for the host, and restrict access to it. Treat the key as a credential: anyone who obtains it may be able to publish to the associated stream.
  4. Load and enable the unit. After saving the unit, run sudo systemctl daemon-reload, then sudo systemctl enable --now ffmpeg-youtube.service. Enabling configures the service to start at boot; --now also starts it immediately.
  5. Check whether it started. Run systemctl status ffmpeg-youtube.service and inspect journalctl -u ffmpeg-youtube.service for service and process messages. Confirm the stream reaches YouTube rather than assuming that an active systemd unit means a working broadcast.

Choose restart behavior and a safe delay

Restart=on-failure

For a long-running stream, this is the recommended systemd policy in the cited service manual. It requests a restart when the process terminates abnormally, rather than treating a normal exit as a failure. It is a useful default when FFmpeg is expected to keep running until stopped or until an error occurs.

Rank #2
Raspberry SC15184 Pi 4 Model B 2019 Quad Core 64 Bit WiFi Bluetooth (2GB)
  • Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1. 5GHz
  • 2. 4 GHz and 5. 0 GHz IEEE 802. 11b/g/n/ac wireless LAN, Bluetooth 5. 0, BLE
  • 2 × USB 3. 0 ports, 2 x USB 2. 0 Ports
  • 2 × micro HDMI ports supproting up to 4Kp60 video resolution
  • Micro SD card slot for loading operating system and data storage

Restart=always

This policy is broader: systemd attempts to restart the service even after a clean process exit, subject to systemd’s restart rules and limits. That may suit a service that must remain running regardless of how its main process exits, but it can also relaunch a command that intentionally completed. Select it only if that behavior is wanted; it does not make a faulty command healthy.

RestartSec= and start-rate limiting

RestartSec=5 in the example asks systemd to wait five seconds before a restart. Treat that as an illustrative delay, not a universally correct value: choose a delay appropriate to the failure and allow time for transient conditions to clear. If the service fails repeatedly in quick succession, systemd’s start-rate limit can stop further attempts and leave the unit failed. Review StartLimitIntervalSec= and StartLimitBurst= behavior for the installed systemd version before changing limits. Avoid unlimited rapid restarts; a loop can obscure the original error and add unnecessary load.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Raspberry Pi 4 Model B (2GB)
  • Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
  • 1GB, 2GB, 4GB or 8GB LPDDR4-3200 SDRAM (depending on model)
  • 2.4 GHz and 5.0 GHz IEEE 802.11ac wireless, Bluetooth 5.0, BLE Gigabit Ethernet
  • 2 USB 3.0 ports; 2 USB 2.0 ports.
  • Raspberry Pi standard 40 pin GPIO header (fully backwards compatible with previous boards)

Match recovery to the failure layer

Failure layer Possible mechanism What it does What it does not establish
Supported input connection FFmpeg protocol reconnect options Can retry certain input-side disconnections or errors, depending on the protocol and options. It does not guarantee that every input protocol supports the same flags, or reconnect an outgoing YouTube publisher.
Output connection while FFmpeg remains alive FFmpeg FIFO muxer recovery Can attempt output recovery with options such as attempt_recovery and recovery_wait_time. The cited example is generic RTMP guidance, not a YouTube-specific validation or a guarantee of successful recovery.
FFmpeg process exit systemd restart policy Can relaunch the process after a failure, with configured delay and start-rate limits. It cannot correct the cause of the exit or guarantee uninterrupted playback.

Input disconnects: protocol-specific reconnect options

FFmpeg documents options including reconnect, reconnect_on_network_error, reconnect_streamed, and reconnect_at_eof. They cover different conditions, and their applicability depends on the input protocol. In particular, an option documented for one protocol should not be assumed to work for RTMP or every capture source. Consult the FFmpeg protocol documentation for the protocol you actually use and confirm the syntax supported by your installed build.

reconnect_at_eof can be useful for an input expected to continue or be treated as live at end-of-file, but it is not a general-purpose fix for an output stream dropping. Input reconnect settings operate on inputs; do not rely on them to restore an outgoing YouTube RTMP or RTMPS connection.

Rank #4
Vilros Raspberry Pi 4 Complete Starter Kit- Includes Raspberry Pi 4 Board, Fan Cooled Case, 64GB Preloaded Micro SD Card and More (4GB, Clear Transparent Case)
  • Vilros Complete Starter Kit for Pi 4 Includes Raspberry Pi 4 Model B Board and all the accessories you need to get started.
  • 9-PART KIT WILL HAVE YOU READY TO GET UP AND RUNNING: Kit Includes 1. Raspberry Pi 4 Model B Board 2. Case With Easy to connect Built-in fan 3. 64GB Micro SD card Preloaded with RP OS 4. Vilros Pi 4 Compatible Power Supply with Inline on/off switch (power supply color may vary white/black) 5. Micro HDMI to Standard HDMI cable (5ft) 6. Micro SD to USB adapter to reflash card if desired 7. Neoprene Storage Bag to store all parts when not in use 8. Set of 4 Heatsinks 9. Vilros QuickStart Guide instruction booklet for Pi 4
  • PASSIVE & ACTIVE COOLING: The included case is well-vented and the kit also includes a set of heatsinks with thermal stickers for easy application and a pre-installed fan to keep the board cool in any use.
  • CONVENIENT ACCESSORIES: The power supply features an inline on/off switch neoprene bag that holds and protects all the parts when not in use and the QuickStart guide is updated and written for Raspberry Pi 4.
  • IMPORTANT: Kit does NOT include Keyboard, Mouse or Monitor

Output interruptions: FIFO muxer recovery

If FFmpeg stays alive while an output connection fails, investigate the FIFO muxer’s output-side recovery options, including attempt_recovery and recovery_wait_time. The documented example pattern uses -f fifo, -fifo_format flv, and recovery parameters for a generic RTMP destination. See the FFmpeg FIFO muxer documentation and verify the exact options against the installed version. This is distinct from systemd restarting the entire FFmpeg process, and the generic example is not proof of YouTube-specific behavior.

Process exits: let systemd relaunch FFmpeg

Use the service restart policy when the process itself terminates. If it repeatedly exits, use the service and FFmpeg logs to find the cause before increasing restart limits. A service that keeps restarting while YouTube remains offline is a signal to diagnose the underlying failure, not evidence that the retry policy needs to be made more aggressive.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
CanaKit Raspberry Pi 4 4GB Basic Kit with PiSwitch (4GB RAM)
  • Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM)
  • CanaKit 3.5A USB-C Power Supply with Noise Filter (UL Listed) specially designed for the Raspberry Pi 4 (5-foot cable)
  • CanaKit USB-C PiSwitch (On/Off Power Switch)
  • Set of 3 Aluminum Heat Sinks for the Raspberry Pi 4
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Use YouTube-compatible live encoder settings

YouTube recommends RTMPS for Live ingest. Its current encoder guidance lists H.264, H.265 (HEVC), and AV1 video encoding, AAC or MP3 audio, constant bitrate (CBR), and a recommended two-second keyframe frequency that must not exceed four seconds. Bitrate guidance varies by resolution and frame rate, so choose the applicable value from YouTube’s current table rather than applying a single bitrate to every stream. Settings accepted by FFmpeg do not by themselves establish that YouTube will accept the stream.

Before a scheduled broadcast, check YouTube’s current encoder settings, bitrates, and resolutions and match the codec, resolution, frame rate, bitrate, and keyframe interval to the target stream. YouTube’s instruction is: “Make sure to test before you start your live stream.”

Troubleshoot a stream that keeps stopping

  • The unit fails immediately: Inspect systemctl status ffmpeg-youtube.service and journalctl -u ffmpeg-youtube.service. Check the FFmpeg executable path, input file or source availability, command syntax, output URL, and permissions. Validate the command manually in a safe test before relying on the service.
  • FFmpeg exits and systemd retries: Read the FFmpeg error before changing RestartSec= or start-rate limits. Check for invalid credentials, an unavailable input, a rejected ingest, and incompatible encoding settings. A restart repeats the command; it does not amend it.
  • The process is active but YouTube shows no incoming stream: Confirm the current stream key and ingest details in YouTube’s live dashboard, and inspect FFmpeg output logs. Verify that the output protocol and encoder settings match YouTube’s current guidance. Avoid publishing the stream key while sharing logs or unit files.
  • An input source disconnects: Identify the input protocol first, then use only reconnect options documented for that protocol. Do not assume an input-side option repairs an output-side disconnection.
  • The output drops but FFmpeg remains running: Check whether an output recovery approach such as the FIFO muxer is appropriate for the installed FFmpeg version. A systemd restart policy only reacts when its service process meets restart conditions.
  • The unit stops attempting restarts: Check the journal for start-limit messages and inspect the installed systemd version’s start-rate limit behavior. Correct the repeated failure; only adjust the interval or burst settings when the intended retry behavior is clear.
  • The service is enabled but does not start at boot as expected: Check unit ordering and whether the host’s network-online target is actually configured to wait for network readiness. The target dependency cannot guarantee YouTube connectivity.

Or let it run in the cloud

If maintaining a host, systemd unit, FFmpeg command, and recovery settings is more work than you want, StreamNeo keeps an uploaded video or playlist running as a 24/7 YouTube stream from the cloud. Upload your recording, add your YouTube stream key, and go live. Your computer and home connection do not have to stay on; each slot streams the uploaded quality up to 4K 60fps at one flat price, and StreamNeo automatically attempts recovery if YouTube drops the stream. The first day is free with no card required, one free day per account. Monthly service is $9.99 per month. StreamNeo plays uploaded videos; it does not broadcast a live camera feed. Start your free day with StreamNeo.

Quick Recap

Bestseller No. 1
CanaKit Raspberry Pi 4 4GB Starter PRO Kit - 4GB RAM
CanaKit Raspberry Pi 4 4GB Starter PRO Kit - 4GB RAM
Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM); Includes Pre-Loaded 32GB EVO+ Micro SD Card (Class 10), USB MicroSD Card Reader
$159.99
Bestseller No. 2
Raspberry SC15184 Pi 4 Model B 2019 Quad Core 64 Bit WiFi Bluetooth (2GB)
Raspberry SC15184 Pi 4 Model B 2019 Quad Core 64 Bit WiFi Bluetooth (2GB)
Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1. 5GHz; 2. 4 GHz and 5. 0 GHz IEEE 802. 11b/g/n/ac wireless LAN, Bluetooth 5. 0, BLE
$89.93
Bestseller No. 3
Raspberry Pi 4 Model B (2GB)
Raspberry Pi 4 Model B (2GB)
Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz; 1GB, 2GB, 4GB or 8GB LPDDR4-3200 SDRAM (depending on model)
$83.00
Bestseller No. 5
CanaKit Raspberry Pi 4 4GB Basic Kit with PiSwitch (4GB RAM)
CanaKit Raspberry Pi 4 4GB Basic Kit with PiSwitch (4GB RAM)
Includes Raspberry Pi 4 4GB Model B with 1.5GHz 64-bit quad-core CPU (4GB RAM); CanaKit USB-C PiSwitch (On/Off Power Switch)
$124.99

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.