Linux

FFmpeg auf Debian: HLS-Streaming mit Apache Schritt für Schritt einrichten

Eigene Videos streamen, ohne auf externe Plattformen angewiesen zu sein: In diesem Beitrag erfährst du Schritt für Schritt, wie du mit FFmpeg auf Debian Videos in HLS umwandelst, adaptive Streaming-Qualitäten bereitstellst und Apache für die Auslieferung von .m3u8- und .ts-Dateien korrekt konfigurierst.

4 min Lesezeit
Grafik: FFmpeg auf Debian für HLS-Streaming nutzen

Einführung

Video-Streaming gehört heute zu den wichtigsten Technologien im Internet. Ob Schulungsplattform, Videobibliothek, Live-Übertragung oder eigenes Medienportal – Nutzer erwarten eine zuverlässige Wiedergabe auf Smartphones, Tablets, Computern und Smart-TVs.

Ein weit verbreiteter Standard dafür ist HTTP Live Streaming (HLS). Das von Apple Inc. entwickelte Verfahren zerlegt Videos in kleine Segmente und ermöglicht eine adaptive Anpassung der Bildqualität an die verfügbare Bandbreite.

Mit dem Open-Source-Werkzeug FFmpeg lässt sich HLS auch auf einem Debian-Server vollständig selbst betreiben – ohne externe Streaming-Dienste oder Cloud-Plattformen.

In diesem Artikel erfährst du:

  • Wie FFmpeg unter Debian installiert wird
  • Wie Videos in HLS umgewandelt werden
  • Wie Multi-Bitrate-Streaming eingerichtet wird
  • Welche Apache-Konfiguration erforderlich ist
  • Welche Best Practices für den produktiven Betrieb gelten

Was ist HLS?

HLS (HTTP Live Streaming) basiert auf einem einfachen Prinzip:

Statt eine komplette Videodatei an den Client zu übertragen, wird das Video in viele kleine Segmente aufgeteilt.

Typischerweise entstehen:

playlist.m3u8
segment_000.ts
segment_001.ts
segment_002.ts
...

Die Playlist-Datei (.m3u8) beschreibt dabei, welche Videosegmente abgespielt werden müssen.

Der Player lädt die Segmente anschließend per HTTP nach.

Vorteile:

  • Funktioniert über normale Webserver
  • Keine speziellen Streaming-Server notwendig
  • Hohe Skalierbarkeit
  • Unterstützung durch nahezu alle modernen Geräte
  • Adaptive Bitraten möglich

Voraussetzungen

Für die Einrichtung benötigst du:

  • Debian 12 oder Debian 13
  • Root-Zugriff oder sudo-Rechte
  • Apache oder Nginx
  • FFmpeg
  • Ein Testvideo

FFmpeg installieren

Zunächst wird FFmpeg installiert:

apt update
apt install ffmpeg -y

Anschließend kann die Installation überprüft werden:

ffmpeg -version

Die Ausgabe sollte Informationen zur installierten FFmpeg-Version anzeigen.


Verzeichnis für HLS-Dateien anlegen

Die erzeugten HLS-Dateien sollten in einem über den Webserver erreichbaren Verzeichnis gespeichert werden.

Beispielsweise:

mkdir -p /var/www/hls

Dieses Verzeichnis wird später die Playlists und Segmente enthalten.


Erstes Video in HLS umwandeln

Ein einfaches Beispiel:

ffmpeg -i input.mp4 \
-c:v libx264 \
-preset veryfast \
-crf 23 \
-c:a aac \
-b:a 128k \
-f hls \
-hls_time 6 \
-hls_list_size 0 \
-hls_segment_filename "/var/www/hls/segment_%03d.ts" \
/var/www/hls/playlist.m3u8

Nach Abschluss befinden sich die HLS-Dateien im Zielverzeichnis.

Beispiel:

/var/www/hls/
├── playlist.m3u8
├── segment_000.ts
├── segment_001.ts
├── segment_002.ts
└── ...

Die wichtigsten FFmpeg-Parameter

Video-Codec

-c:v libx264

Kodiert das Video in H.264.

Dieser Codec wird von praktisch allen Geräten unterstützt.


Audio-Codec

-c:a aac

Kodiert den Ton in AAC.

AAC ist der Standard für HLS.


Segmentlänge

-hls_time 6

Legt fest, dass jedes Segment sechs Sekunden lang ist.

Typische Werte:

AnwendungSegmentlängeVideo-on-Demand6–10 SekundenLive-Streaming2–4 SekundenNiedrige Latenz1–2 SekundenVollständige Playlist

-hls_list_size 0

Alle Segmente werden in der Playlist gespeichert.

Ideal für Video-on-Demand.


Multi-Bitrate-Streaming einrichten

Professionelle Streaming-Dienste stellen mehrere Qualitätsstufen bereit.

Der Client entscheidet selbst, welche Qualität aktuell sinnvoll ist.

Beispiel:

  • 480p
  • 720p
  • 1080p

FFmpeg kann dies automatisch erzeugen.

Beispiel:

ffmpeg -i input.mp4 \
-filter_complex "[0:v]split=2[v1][v2]; \
[v1]scale=1280:720[v1out]; \
[v2]scale=854:480[v2out]" \
-map "[v1out]" -c:v:0 libx264 -b:v:0 3000k \
-map "[v2out]" -c:v:1 libx264 -b:v:1 1500k \
-map a:0 -c:a aac -b:a 128k \
-f hls \
-var_stream_map "v:0,a:0 v:1,a:0" \
-master_pl_name master.m3u8 \
-hls_time 6 \
-hls_list_size 0 \
-hls_segment_filename "/var/www/hls/v%v/segment_%03d.ts" \
/var/www/hls/v%v/playlist.m3u8

Die erzeugte Master-Playlist verweist auf alle verfügbaren Qualitätsstufen.


Apache für HLS konfigurieren

Damit Browser und Player die Dateien korrekt erkennen, müssen die MIME-Typen konfiguriert werden.

Viele Administratoren fragen sich, wo diese Einstellungen eingetragen werden sollen.

Die empfohlene Lösung ist die jeweilige Virtual-Host-Konfiguration unter:

/etc/apache2/sites-available/

Beispiel:

<VirtualHost *:80>

    ServerName video.example.de

    DocumentRoot /var/www/html

    AddType application/vnd.apple.mpegurl .m3u8
    AddType video/mp2t .ts

</VirtualHost>

Danach:

systemctl reload apache2

Alternative: Serverweite Konfiguration

Wer die MIME-Typen für alle Webseiten bereitstellen möchte, kann eine eigene Apache-Konfiguration erstellen.

Datei:

/etc/apache2/conf-available/hls.conf

Inhalt:

AddType application/vnd.apple.mpegurl .m3u8
AddType video/mp2t .ts

Aktivieren:

a2enconf hls
systemctl reload apache2

MIME-Modul prüfen

Die Einstellungen funktionieren nur, wenn das Apache-MIME-Modul aktiv ist.

Prüfen bzw. aktivieren:

a2enmod mime
systemctl reload apache2

Funktionstest

Nach der Konfiguration sollte die Playlist erreichbar sein:

http://server.example.de/hls/playlist.m3u8

Per Kommandozeile lässt sich der Content-Type prüfen:

curl -I http://server.example.de/hls/playlist.m3u8

Erwartete Ausgabe:

Content-Type: application/vnd.apple.mpegurl

Wiedergabe testen

Die Wiedergabe kann beispielsweise mit:

  • VLC media player
  • Video.js

erfolgen.

Gerade Video.js eignet sich hervorragend für eigene Webportale.


Live-Streaming mit FFmpeg

Neben Video-on-Demand unterstützt FFmpeg auch Live-Streams.

Beispiel für eine RTSP-Kamera:

ffmpeg -i rtsp://kamera-adresse \
-c:v libx264 \
-c:a aac \
-preset veryfast \
-f hls \
-hls_time 2 \
-hls_list_size 5 \
-hls_flags delete_segments \
/var/www/hls/live.m3u8

Hierbei werden fortlaufend neue Segmente erzeugt und alte automatisch entfernt.


Performance optimieren

Bei größeren Videomengen wird die CPU-Auslastung schnell zum Thema.

Empfehlungen:

Schnellere Presets

-preset veryfast

oder

-preset superfast

Hardware-Encoding

Moderne Server können häufig Hardware-Beschleunigung nutzen:

Intel

VAAPI

NVIDIA

NVENC

AMD

AMF

Dadurch sinkt die CPU-Last drastisch.


Typische Fehler

Playlist wird heruntergeladen statt abgespielt

Ursache:

MIME-Type fehlt.


Video startet nicht

Ursache:

Nicht unterstützter Codec.

Empfehlung:

  • H.264
  • AAC

Hohe CPU-Auslastung

Ursache:

Zu langsames Preset oder fehlende Hardware-Beschleunigung.


Schwarzer Bildschirm im Browser

Ursache:

Der Browser unterstützt HLS nicht direkt.

Lösung:

Video.js oder einen kompatiblen HLS-Player verwenden.


Mit FFmpeg und Debian lässt sich ohne zusätzliche Streaming-Software eine leistungsfähige HLS-Plattform aufbauen.

Die Kombination aus:

  • FFmpeg
  • Apache
  • HLS
  • H.264
  • AAC

bietet eine stabile und bewährte Grundlage für Videoportale, E-Learning-Plattformen, Behördenportale oder interne Mediatheken.

Besonders attraktiv ist dabei, dass HLS vollständig auf normalen HTTP-Anfragen basiert und daher problemlos hinter Reverse-Proxys, Firewalls und Load-Balancern betrieben werden kann.

Wer bereits einen Debian-Webserver betreibt, kann mit wenigen Konfigurationsschritten eine professionelle Streaming-Infrastruktur aufbauen und behält dabei die volle Kontrolle über Daten, Qualität und Kosten.