Eine M3U-Playlist ist nur so legal wie die Stream-URLs, die sie enthält. Öffentlich zugängliche Streams öffentlich-rechtlicher Sender (ARD, ZDF, arte) für den privaten Eigengebrauch zu aggregieren, ist urheberrechtlich weniger problematisch als das Einbinden lizenzpflichtiger Inhalte ohne Rechtegrundlage. Kommerzielle Nutzung und Weiterverteilung sind in jedem Fall ausgeschlossen. Lesen Sie dazu: IPTV und Urheberrecht in Deutschland.
Was Sie vor dem ersten Eintrag brauchen
Eine M3U-Playlist ist eine einfache Textdatei. Sie brauchen keinen speziellen Editor — ein einfacher Texteditor wie Notepad++ (Windows), BBEdit (macOS) oder VS Code (alle Plattformen) reicht aus. Entscheidend ist, dass der Editor die Datei in UTF-8 ohne BOM speichert. Ein BOM (Byte Order Mark) am Dateianfang — ein unsichtbares Zeichen, das manche Windows-Editoren automatisch einfügen — bricht den M3U-Header und verhindert das korrekte Parsen durch IPTV-Apps.
Außerdem brauchen Sie für jeden Sender, den Sie einbinden möchten, eine funktionsfähige Stream-URL. Bevor Sie die URL in die Playlist eintragen, testen Sie sie in VLC: Medien → Netzwerk öffnen → URL einfügen. Läuft der Stream in VLC, läuft er auch in Ihrer Playlist. Läuft er nicht, liegt das Problem beim Stream, nicht bei Ihrer Playlist-Syntax.
Notepad++: Format → UTF-8 (ohne BOM) | VS Code: Unten rechts auf die Kodierungsanzeige klicken → „UTF-8" wählen (nicht „UTF-8 with BOM") | Windows-Notepad (Standard): Speichern unter → Kodierung → UTF-8 ohne BOM (ab Windows 10 verfügbar).
Die vollständige M3U-Struktur — Zeile für Zeile
Jede M3U-Datei beginnt zwingend mit #EXTM3U als erster Zeile. Danach folgt für jeden Kanal ein Zweizeiler: erst die Metadatenzeile (#EXTINF), direkt darunter die Stream-URL. Keine Leerzeile zwischen beiden.
Häufige Syntaxfehler und wie man sie vermeidet
| Fehler | Symptom | Lösung |
|---|---|---|
Leerzeile zwischen #EXTINF und URL |
Kanal erscheint nicht oder ohne Metadaten | #EXTINF-Zeile und URL-Zeile direkt aufeinanderfolgend, keine Leerzeile dazwischen |
| UTF-8 mit BOM gespeichert | Erste Zeile wird nicht als #EXTM3U erkannt; alle Kanäle fehlen |
Editor auf „UTF-8 ohne BOM" umstellen; Datei neu speichern |
| Anführungszeichen fehlen um Attributwerte | Kanal-Metadaten werden nicht korrekt geparst | Alle Attributwerte in doppelte Anführungszeichen einschließen: tvg-id="ard.de" |
| Komma vor dem Kanalnamen fehlt | Kanalname erscheint leer oder inkorrekt | Am Ende der #EXTINF-Zeile steht immer ein Komma, dann der Kanalname: …,Das Erste HD |
tvg-id stimmt nicht mit EPG-Kanal-ID überein |
Kanäle spielen ab, aber kein EPG sichtbar | EPG-XML-Datei im Texteditor öffnen; exakte channel id-Werte abgleichen — Groß-/Kleinschreibung beachten |
| Sonderzeichen in URLs nicht URL-enkodiert | Bestimmte Streams laden nicht | Leerzeichen in URLs als %20, & als & kodieren |
| Windows-Zeilenenden (CRLF) statt Unix (LF) | Kanäle auf manchen Linux-/Android-Parsern nicht erkannt | Im Editor auf LF-Zeilenenden umstellen: Notepad++ → Bearbeiten → Zeilenenden-Konvertierung → Unix |
EPG-IDs korrekt zuordnen
Der häufigste Grund, warum eine technisch korrekte M3U keine EPG-Daten zeigt, ist eine nicht übereinstimmende tvg-id. Der Wert in der M3U muss zeichengenau mit dem id-Attribut des <channel>-Elements in der EPG-XML-Datei übereinstimmen.
So finden Sie die korrekten IDs: Laden Sie die EPG-XML-Datei Ihres Providers herunter (oder öffnen Sie die URL im Browser). Öffnen Sie die Datei in einem Texteditor und suchen Sie nach dem Sendernamen — z. B. „Das Erste". Die zugehörige Zeile sieht etwa so aus: <channel id="ard.de">. Der Wert ard.de ist die tvg-id, die Sie in Ihre M3U eintragen.
# Ausgabe-Beispiel: # <channel id="ard.de"> # <channel id="zdf.de"> # <channel id="arte.de">
# Windows (PowerShell) Select-String -Path epg.xml -Pattern 'channel id' | Select-Object -First 20
Falls EPG-Daten um 1–2 Stunden verschoben erscheinen, kann der Zeitversatz direkt pro Kanal gesetzt werden: tvg-shift="1" für CET (Winterzeit) oder tvg-shift="2" für CEST (Sommerzeit) — aber nur, wenn die EPG-Datei Zeiten in UTC enthält. Enthält die EPG-Datei bereits lokale Zeit (erkennbar an +0100 oder +0200 im Zeitstempel), kein Shift eintragen.
Playlist mit VLC und ffprobe testen
Bevor Sie die fertige Playlist in TiviMate oder eine andere App laden, validieren Sie jeden Stream mit VLC. Das trennt Playlist-Fehler von Stream-Fehlern und spart Fehlersuche in der App.
VLC-Schnelltest für die gesamte Playlist
oder per Drag & Drop in das VLC-Fenster
# Einzelnen Stream per URL testen Medien → Netzwerk öffnen (Strg+N) → Stream-URL einfügen
# Kommandozeile (Stapeltest mehrerer URLs) vlc --playlist-autostart --no-video-title-show meine-playlist.m3u8
ffprobe für detaillierte Stream-Analyse
VLC zeigt, ob ein Stream läuft. ffprobe (Teil des ffmpeg-Pakets) zeigt, was der Stream enthält: Codec, Auflösung, Bitrate und Audio-Format. Das ist nützlich, wenn ein Stream in VLC läuft, aber auf einem Endgerät ruckelt — oft liegt es am Codec.
ffprobe -v quiet -print_format json -show_streams \
"https://stream.example.com/ard/hd/index.m3u8" 2>&1 | head -60
# Relevante Ausgabefelder: # "codec_name": "h264" oder "hevc" → H.264 oder H.265 # "width": 1920, "height": 1080 → Full HD bestätigt # "bit_rate": "4500000" → ca. 4,5 Mbit/s # "codec_name": "aac" oder "ac3" → Audio-Codec
Kanalreihenfolge und Gruppenstruktur optimieren
IPTV-Apps sortieren Kanäle standardmäßig nach der Reihenfolge in der M3U-Datei oder alphabetisch nach Kanalname — abhängig von der App. TiviMate ermöglicht manuelles Umsortieren nach dem Import; OTT Navigator sortiert primär nach group-title. Eine sauber strukturierte Playlist mit konsistenten Gruppen spart in jedem Fall nachträgliche Sortierarbeit.
- Gruppen konsequent benennen: Verwenden Sie einheitliche
group-title-Werte ohne Tippvarianten — „DE | Öffentlich-rechtlich" und „DE | Oeffentlich-rechtlich" erzeugen zwei separate Gruppen. - Wichtigste Sender zuerst: Viele Apps zeigen Kanäle in der Playlist-Reihenfolge innerhalb einer Gruppe. Ordnen Sie häufig genutzte Sender an den Anfang.
- Tote Streams entfernen: Jeder Stream, der in VLC nicht läuft, sollte vor dem Import entfernt werden. Tote Einträge verlangsamen den Ladevorgang und verwirren bei der EPG-Zuordnung.
- Logos auf erreichbare URLs prüfen: Ein nicht erreichbares Logo lädt dauerhaft nach und kann App-Performance beeinträchtigen. Testen Sie Logo-URLs im Browser.
- Datei-Encoding abschließend prüfen: Öffnen Sie die fertige Datei in einem Hex-Editor oder prüfen Sie mit
file meine-playlist.m3u8(Linux/macOS) — erwartete Ausgabe: „UTF-8 Unicode text".
Häufige Fragen — M3U-Playlist erstellen
id-Attributs im <channel id="…">-Element ab. Dieser Wert muss zeichengenau — Groß-/Kleinschreibung und Sonderzeichen eingeschlossen — in der tvg-id Ihrer M3U stehen. Alternativ: Suchen Sie in öffentlichen EPG-Projekten (z. B. auf GitHub) nach xmltv-Dateien für Deutschland, die dokumentierte Kanal-IDs enthalten.
#EXTM3U-Header dann nicht. Datei in UTF-8 ohne BOM neu speichern. (2) Windows-Zeilenenden (CRLF) — manche TiviMate-Versionen auf Android TV parsen CRLF nicht korrekt. Auf LF-Zeilenenden umstellen. (3) Leerzeile zwischen #EXTINF und Stream-URL — TiviMate überspringt dann die URL. (4) Datei ist als .m3u gespeichert, TiviMate erwartet .m3u8 — Dateiendung anpassen.