Früher galt am DVD-Player die eiserne Regel: No disc – no fun. Heute, mit einer eigenen Streaming-Infrastruktur, ist ironischerweise genau das Gegenteil unser Ziel: Der wahre Spaß beginnt erst, wenn man überhaupt keine physische Disc mehr anfassen muss.
Matroschkamanufaktur
Für die meisten Discs ist MakeMKV das Mittel der Wahl. Das Tool verhält sich wie ein Panzer: Es pflügt stoisch durch intakte oder leicht zerkratzte Dateisysteme, ignoriert den Kopierschutz und extrahiert die rohen Video- und Audiospuren ohne Qualitätsverlust direkt in einen Matroska-Container.
Der Matroska-Container
Oft wird MKV fälschlicherweise für ein Videoformat gehalten. Architektonisch gesehen ist es aber ein reines Container-Format – am ehesten vergleichbar mit einem .tar-Archiv oder einem Docker-Container. Der Name leitet sich passenderweise von den ineinander verschachtelten russischen Matroschka-Puppen ab.
In einer einzigen MKV-Datei (“Multiplex”) liegen die verschiedenen Datenströme strikt entkoppelt nebeneinander:
- Video-Payload: Der eigentliche Bildstream (oft encodiert in H.264 oder HEVC/H.265).
- Audio-Payloads: Beliebig viele Tonspuren (z. B. Deutsch AC3, Englisch DTS).
- Subtitles: Eingebettete Text- oder Bild-Untertitel.
- Metadaten: Kapitelmarken, Fonts und Sprach-Tags.

Kompression mit HandBrake
Rohe Rips sind riesig – eine Blu-ray belegt schnell über 30 GB. Um den Storage zu schonen, schicke ich die MKVs im Anschluss durch HandBrake. Mit modernen Codecs wie H.265 (HEVC) lässt sich das Rohmaterial auf etwa 2 GB eindampfen. Das ist ein Verhältnis von gut 15:1, ohne dass man beim Streamen auf dem Tablet sichtbare Einbußen oder Artefakte in Kauf nehmen muss.

In Handbrake fügt man Video, Audio und Untertitel zusammen.
Interlacing
Bei der Serie “Lock n’ Load with R. Lee Ermey” ist mir aufgefallen, dass TV-Dokus aus dieser Ära auf DVD fast immer interlaced (50i oder 60i) sind, weil sie rein für das klassische Broadcast-Fernsehen produziert wurden. Wenn man die roh gerippten MKVs unbesehen durch HandBrake jagt, gibt es später bei schnellen Kameraschwenks unschöne horizontale “Kamm-Artefakte” im Bild.
Stelle unbedingt sicher, dass in HandBrake unter dem Reiter Filters der Decomb- oder Deinterlace-Filter aktiv ist. Meist reicht hier die Einstellung Default oder Yadif, damit die Pipeline aus dem alten TV-Signal wieder saubere, progressive Vollbilder für dein Tablet berechnet.
DD to the Rescue
Es war höchste Zeit, die optischen Datenträger mal einzulesen, denn etliche hatten schon so viele Lesefehler, dass sie gar nicht mehr lesbar waren. Schlägt MakeMKV fehl, lässt sich eventuell noch was mit ddrescue machen:
ddrescue --no-scrape -b 2048 /dev/rdisk4 zatoichi.iso zatoichi.mapDabei liest das Programm bitweise die Disk aus und speichert sie in der ISO-Datei. Das Mapfile ist essenziell, um bei Abbrüchen den Zustand zu tracken. Mit dem Parameter --no-scrape wird auf das forcierte Auslesen bei harten Fehlern (wie tiefen Kratzern oder defekten Layer-Breaks) verzichtet. Das schont die Hardware und hat eventuell kleine Aussetzer in Bild oder Ton zur Folge, trübt aber nicht den gesamten Filmgenuss.
Ist der ISO-Header durch den Kratzer am Anfang so zerschossen, dass die Datei danach nicht mehr mounbar ist, wirft man die unfertige .iso einfach direkt als Quelle in MakeMKV oder extrahiert den rohen Stream per Kommandozeile mit FFmpeg. Alternativ kann man auch das ISO versuchen über das Betriebssystem zu mounten und die einzelnen .VOB-Dateien direkt mit Handbrake zu encoden.
Anatomie eines VOBU
Ein VOBU (Video Object Unit) ist der absolut kleinste, atomare Baustein in der Dateisystem-Architektur einer Video-DVD. Wenn du die DVD als eine Datenbank für Medieninhalte betrachtest, ist das VOBU ein einzelner, in sich geschlossener Datensatz, der exakt 0,4 bis 1,0 Sekunden Spielzeit (meist eine einzelne MPEG-2 “Group of Pictures” von etwa 12 bis 15 Frames) enthält. Ein DVD-Player streamt nicht einfach stumpf eine Videodatei von vorne bis hinten. Er liest sequenziell VOBUs ein. Jedes VOBU ist hochgradig strukturiert und enthält verschachtelte “Packs”:
- NV_PCK (Navigation Pack): Der Header. Er steht zwingend am Anfang jedes VOBUs. Hier stehen die Zeitstempel (PTS) und die Sprungadressen (“Wo liegt das nächste VOBU auf der Disc?”, “Wo liegt das vorherige?”). Das ist der Index, mit dem der Laser navigiert, wenn du vorspulst.
- V_PCK (Video Pack): Die eigentlichen komprimierten MPEG-2 Bilddaten für diese halbe Sekunde.
- A_PCK (Audio Pack): Die Tonspuren (AC3, DTS oder PCM) synchron zum Bild.
- SP_PCK (Subpicture Pack): Die Untertitel. (Bei DVDs sind Untertitel kein Text, sondern winzige, komprimierte Bitmaps, die über das Bild gelegt werden).
MakeMKV entschlüsselt das ISO, reißt die Struktur auf und wirft alle Navigation-Packs (
NV_PCK) ersatzlos in den Müll. MKV nutzt ein komplett anderes, moderneres Indexing. Die Video-, Audio- und Subpicture-Packs extrahiert es, reiht sie aneinander und packt sie in den Matroska-Container. Eine DVD kann nur an den absoluten Grenzen eines VOBUs geschnitten oder mit einer Kapitelmarke versehen werden. Es ist architektonisch unmöglich, ein Kapitel mitten in einem VOBU starten zu lassen.
Jellyfin hosten
Das eigentliche Hosting übernimmt Jellyfin . Die Software ist als Container schnell installiert und greift auf ein vorhandenes Medienverzeichnis zu.

podman run -d \
-v /srv/jellyfin/config:/config:Z \
-v /srv/jellyfin/cache:/cache:Z \
-v /srv/media:/media:Z \
--net=host \
jellyfin/jellyfin:latestAls Reverse-Proxy verwende ich Caddy:
#/etc/caddy/Caddyfile.d/jellyfin.caddyfile
http://tv.kroesch.lan {
reverse_proxy 127.0.0.1:8096
}Sobald die Filme in dem Ordner liegen (ich kopiere sie vom Mac auf den Linux-Server per SMB-Freigabe), liest Jellyfin diese ein und versieht sie per Movie Database mit Cover, Beschreibung, Schauspielerliste und vielem mehr.
Danach ist die Website per Browser, auf dem iPad und dem Android TV (XGIMI-Projektor) erreichbar. Es emfiehlt sich, einen eigenen Benutzer ohne Admin-Rechte auf Jellyfin anzulegen, der nur Lesezugriff hat, so dass die Geräte von allen Familienmitgliedern genutzt werden können.
Feinschliff
Wenn der Standard-Workflow über die grafischen Oberflächen stolpert, weil Laufwerke bei Kratzern streiken oder Tonspuren falsch benannt sind, greife ich auf drei spezialisierte CLI-Tools zurück. Sie bilden das Rückgrat meiner Reparatur-Pipeline:
mkvpropedit (Das Skalpell): Perfekt, um Metadaten in-place zu patchen. Wenn Jellyfin “Unbekannte Sprache” anzeigt, weil der Rip-Prozess den Ländercode verschluckt hat, ändert dieses Tool den Matroska-Header in Millisekunden, ohne die Gigabyte-große Datei neu zu schreiben. Ideal, um nachträglich language=ger für Tonspuren zu setzen oder Titel zu vergeben.
mkvmerge (Der Packer): Das Tool der Wahl für das sogenannte “Remuxing”. Es nimmt vorhandene Datenströme und verpackt sie verlustfrei und rasend schnell neu. Man nutzt es, wenn man externe Untertitel (.srt) aus dem Netz als Standard-Spur fest in den Container integrieren will, oder um versehentlich erstellte MP4-Dateien ohne zeitaufwendiges Neu-Encodieren in MKVs umzuwandeln.
Zum Beispiel lässt sich eine Datei, die Serien als ein MKV enthält, in Kapitel zerteilen:
mkvmerge -o paddington_ep.mkv --split chapters:all paddington_alle_folgen.mkvFFmpeg (Der Dampfhammer): Wenn Dateisysteme komplett zerschossen sind, schlägt die Stunde von FFmpeg. Das Tool kann kaputte ISO-Header ignorieren und die nackten Video-Bytes direkt auslesen. Man zwingt es dazu, fehlende Timestamps mathematisch neu zu generieren (-fflags +genpts) oder rohe Streams aus hoffnungslos beschädigten Bereichen in robuste Transport-Streams (.ts) zu retten, die HandBrake danach wieder anstandslos verarbeiten kann.
Fazit
Der Weg vom verstaubten Plastik im Regal zum hochverfügbaren SSD-Tier ist mitunter steinig. Kaputte Dateisysteme, streikende Laufwerke und zerschossene Container-Header fordern etwas Durchhaltevermögen und den gezielten Einsatz der Kommandozeile.
Doch dieser initiale Aufwand lohnt sich: Hast du die Ingest-Pipeline erst einmal etabliert und Jellyfin präsentiert dir die saubere Cover-Übersicht im Browser, ist das Legacy-Problem endgültig gelöst. Die physischen Medien wandern in den Keller und das Heimkino startet auf Knopfdruck.
UPDATE: Untertitel herstellen
Einen meiner Lieblingsfilme, Takeshi Kitanos “Zatoichi”, konnte ich leider auch mit ddrescue nicht digital auslesen. Auf archive.org habe ich dann das japanische Original als MP4-Datei gefunden. Leider beschränkt sich mein Japanisch auf einige FLoskeln und das was ich in Judo oder Iaido gelernt habe.
Hier ist der Trick, mit dem man englische und deutsche Untertitel herstellen kann. Zunächst wird der Audiostream vom Video getrennt:
ffmpeg -y -i Zatoichi.mp4 -map 0:a:0 -ac 1 -ar 16000 -c:a pcm_s16le audio_ja_mono.wavDanach installiere ich faster-whisper:
uv init --name subtitles
uv add faster-whisperund starte folgendes Python-Skript:
#!/usr/bin/env python3
from faster_whisper import WhisperModel
def format_timestamp(seconds):
h = int(seconds // 3600)
m = int((seconds % 3600) // 60)
s = int(seconds % 60)
ms = int((seconds % 1) * 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
print("Lade Whisper v2 Modell...")
# Nutzt die CPU und quantisiert auf int8 für Geschwindigkeit
model = WhisperModel("large-v2", device="cpu", compute_type="int8")
# vad_filter=True gegen Halluzinationen
segments, info = model.transcribe(
"audio_mono.wav",
language="ja",
task="translate",
vad_filter=True,
vad_parameters=dict(min_silence_duration_ms=500)
)
with open("zatoichi_en_clean.srt", "w", encoding="utf-8") as f:
for i, segment in enumerate(segments, start=1):
start = format_timestamp(segment.start)
end = format_timestamp(segment.end)
f.write(f"{i}\n{start} --> {end}\n{segment.text.strip()}\n\n")
print(f"[{start} --> {end}] {segment.text.strip()}")Hernach baut man wieder die Matroschka zusammen:
mkvmerge -o zatoichi_final.mkv Zatoichi.mp4 --language 0:eng --default-track 0:yes zatoichi_en_clean.srtMit dem Experimentieren war ich weniger als zwei Stunden beschäftigt. Und es bekommt jeder ohne Japanischkenntnisse hin.
Kommentare