From bc6c3e83a7003f230ccdf3682d6d3b211db4611c Mon Sep 17 00:00:00 2001 From: Melbar Date: Thu, 7 May 2026 18:32:14 +0200 Subject: [PATCH] Bring README in sync with current workflow --- README.md | 222 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 127 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index 921adda..964e462 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,103 @@ -# Amazon PVD Mezzanine Encoder - -**Automatisches Python-Tool zur Erstellung von Amazon PVD-konformen Mezzanine-VOD-Dateien und Audio-Master-Dateien** -(ProRes • Blu-ray • DVD • PAL • NTSC • Interlaced) - ---- - -## Features - -- **Vollautomatische Erkennung** von SD/HD, PAL/NTSC und interlaced Material -- **ProRes-Quellen mit mehreren Tonspuren** werden unterstuetzt -- **Audio-Sprache und Layout aus Dateinamen** (`DEU51_ENG20`, `DEU20`, usw.) -- **HD-PVD-MP4 mit 30 Mbit/s** und deutscher Stereo-Spur -- **Automatischer Downmix** von deutscher 5.1-Spur auf Stereo, wenn keine deutsche Stereo-Spur vorhanden ist -- **Separate PCM-Audio-MOVs** fuer deutsche Tonspuren und originalsprachige Tonspuren -- **Bester Deinterlacer** (`bwdif mode=0`) → saubere 25 fps bei PAL-DVDs (kein Double-Framerate) -- **Automatische Farbraum-Konvertierung** (Rec.601 PAL/NTSC ↔ Rec.709) inkl. `colorspace`-Filter -- **Forced Subtitles** werden automatisch eingebrannt (wenn `_forced.srt` vorhanden) -- **Informative Tkinter-UI** mit Analyse, Audio-Uebersicht und Encoding-Log -- **Windows-Fallback ohne Tkinter** mit nativen Dateidialogen und Konsolen-Log -- **Amazon PVD optimierte Parameter** (Bitrate, Level, GOP, x264-Settings) -- **Saubere Metadaten** + `faststart` für beste Streaming-Performance -- Funktioniert mit Drag & Drop (`.bat` oder direkt auf Script ziehen) - +# Amazon PVD Mezzanine Encoder + +Automatisches Windows-Tool zur Erstellung von Amazon-PVD-Mezzanine-Dateien aus ProRes-, Blu-ray-, DVD- und anderen Videodateien. + +Das Tool erzeugt: + +- ein PVD-MP4 mit deutschem Stereo-Ton +- eine separate MOV-Datei mit allen deutschen Tonspuren als uncompressed PCM +- falls vorhanden, eine separate MOV-Datei mit allen originalsprachigen bzw. nicht-deutschen Tonspuren als uncompressed PCM + +## Aktueller Workflow + +1. Quelle auswaehlen oder als Parameter uebergeben. +2. FFprobe analysiert Video, Audio, Framerate, Aufloesung, Interlacing und Farbraum-Metadaten. +3. Audio-Sprache und Layout werden bevorzugt aus dem Dateinamen gelesen, z.B. `DEU51_ENG20`. +4. Das PVD-MP4 wird erzeugt. +5. Danach werden die Audio-MOVs erzeugt. + ## Voraussetzungen -- Windows (getestet) -- FFmpeg + FFprobe im `PATH`, in `C:\Tools\FFMPEG` oder in `C:\Software` +- Windows - Python 3.10+ -- Schreibzugriff auf den Ausgabeordner `F:\VOD` oder `H:\VOD` - -## Installation & Nutzung - -1. Repo klonen oder herunterladen -2. `ffmpeg.exe` und `ffprobe.exe` in `C:\Software\` ablegen (oder Pfade im Script ändern) -3. Optional: `create_mezzanine.bat` anlegen: - ```bat - @echo off - set "PYTHON_EXE=%LocalAppData%\Programs\Python\Python311\python.exe" - if exist "%PYTHON_EXE%" ( - "%PYTHON_EXE%" "%~dp0pvd_mezzanine.py" %* - ) else ( - py -3 "%~dp0pvd_mezzanine.py" %* - ) - pause - ``` -4. Tool starten: - ```powershell - .\create_mezzanine.bat - ``` -5. In der UI Quelle auswaehlen, analysieren und Encoding starten. +- FFmpeg und FFprobe +- Schreibzugriff auf das Zielverzeichnis -Wenn die installierte Python-Version kein Tkinter mitbringt, oeffnet das Tool automatisch einen Windows-Dateidialog fuer die Quelle, verwendet `H:\VOD` als Ausgabeordner und zeigt die Analyse sowie das Encoding-Log in der Konsole. +FFmpeg und FFprobe werden automatisch gesucht: -Fuer automatisierte CLI-Laeufe kann das Encoding direkt gestartet werden: +1. explizite Pfade aus `config.json` +2. `PATH` +3. `C:\Tools\FFMPEG` +4. `C:\Software` + +## Starten + +Interaktiv: ```powershell -py -3 .\pvd_mezzanine.py --cli "C:\Pfad\zur\Quelle.mov" +.\create_mezzanine.bat ``` -Alternativ kann die Datei direkt als erster Parameter uebergeben werden: +Mit direktem Dateiparameter: ```powershell -.\create_mezzanine.bat "C:\Pfad\zur\Quelle.mov" +.\create_mezzanine.bat "D:\Trailers\Film_DEU51_ENG20.mov" ``` +Direkt per Python: + +```powershell +py -3 .\pvd_mezzanine.py "D:\Trailers\Film_DEU51_ENG20.mov" +``` + +Kompatibler CLI-Modus: + +```powershell +py -3 .\pvd_mezzanine.py --cli "D:\Trailers\Film_DEU51_ENG20.mov" +``` + +Wenn Tkinter in der verwendeten Python-Installation verfuegbar ist, startet eine UI mit Analyse, Audio-Uebersicht und Encoding-Log. + +Wenn Tkinter nicht verfuegbar ist, oeffnet das Tool einen nativen Windows-Dateidialog fuer die Quelle und laeuft danach im Konsolenmodus weiter. Wird eine Datei als Parameter uebergeben, wird kein Dialog geoeffnet. + ## Ausgabe -Das Script schreibt die fertige Mezzanine-Datei standardmäßig nach: +Das Zielverzeichnis wird ueber `config.json` bestimmt: -```text -H:\VOD +1. `output.base_dir`, wenn gesetzt +2. erstes vorhandenes Verzeichnis aus `output.preferred_dirs` +3. falls keines existiert, der erste Eintrag aus `output.preferred_dirs` + +Default: + +```json +"preferred_dirs": [ + "F:\\VOD", + "H:\\VOD" +] ``` -Der MP4-Dateiname wird automatisch aus dem Quellpfad bzw. Blu-ray-Projektordner gebildet und endet auf: - -```text -_DEU20_PVD.mp4 -``` - -Bei ProRes-Quellen werden zusaetzlich Audio-MOVs erzeugt: +Damit wird `F:\VOD` bevorzugt, wenn vorhanden. Sonst wird `H:\VOD` verwendet, wenn vorhanden. + +Dateinamen: ```text +Titel_DEU20_PVD.mp4 Titel_DEU_AUDIO_PCM.mov Titel_OV_AUDIO_PCM.mov ``` -Wenn nur deutsche Tonspuren vorhanden sind, wird nur `Titel_DEU_AUDIO_PCM.mov` erzeugt. +Wenn nur deutsche Tonspuren vorhanden sind, wird keine `Titel_OV_AUDIO_PCM.mov` erzeugt. -## ProRes-Audio-Namen +## ProRes-Audio im Dateinamen -Die Sprache und das Tonformat der Tonspuren werden aus dem Dateinamen gelesen. Die Tokens stehen in der Reihenfolge der Audiospuren im ProRes. +Bei ProRes-Quellen muss die Reihenfolge der Audiospuren im Dateinamen stehen, wenn die Datei selbst keine verlaesslichen Sprach-Metadaten hat. + +Format: + +```text +SPRACHEFORMAT +``` Beispiele: @@ -106,30 +114,40 @@ Film_DEU20_DEU51.mov - Spur 1: Deutsch 2.0 - Spur 2: Deutsch 5.1 -- Es wird nur eine deutsche PCM-Audio-MOV erzeugt. +- Es wird nur eine deutsche Audio-MOV erzeugt. -## Untertitel +Unterstuetzt werden dreistellige Sprachcodes wie `DEU`, `GER`, `ENG`, `FRA`, `ITA`, `SPA` usw. `GER` wird intern wie `DEU` behandelt. -Forced Subtitles werden automatisch eingebrannt, wenn neben der Quelle eine gleichnamige Datei mit dem Suffix `_forced.srt` liegt. - -Beispiel: - -```text -Film.mkv -Film_forced.srt -``` - -## Audio-Ausgabe +## Audio-Regeln - Das PVD-MP4 bekommt immer deutschen Stereo-Ton. -- Wenn eine deutsche 2.0-Spur vorhanden ist, wird sie verwendet. -- Wenn keine deutsche 2.0-Spur vorhanden ist, wird die erste deutsche Spur auf Stereo heruntergemischt. -- Alle deutschen Tonspuren werden als uncompressed PCM in eine separate MOV geschrieben. -- Alle nicht-deutschen Tonspuren werden als uncompressed PCM in eine separate MOV geschrieben. +- Wenn eine deutsche 2.0-Spur vorhanden ist, wird diese verwendet. +- Wenn keine deutsche 2.0-Spur vorhanden ist, wird die erste deutsche Spur per FFmpeg auf Stereo heruntergemischt. +- Alle deutschen Tonspuren werden in eine MOV-Datei mit uncompressed PCM geschrieben. +- Alle nicht-deutschen Tonspuren werden in eine separate MOV-Datei mit uncompressed PCM geschrieben. +- Wenn keine deutsche Tonspur erkannt wird, bricht das Tool mit einer Fehlermeldung ab. + +## Video-Regeln + +- HD wird mit den HD-Werten aus `config.json` encodiert, standardmaessig `30M`. +- SD wird mit den SD-Werten aus `config.json` encodiert, standardmaessig `8M`. +- Interlaced-Material wird mit `bwdif=mode=0:parity=auto` deinterlaced. +- Forced Subtitles werden eingebrannt, wenn neben der Quelle eine Datei mit `_forced.srt` liegt. +- Farbraum-Metadaten werden auf den Ziel-Farbraum gesetzt. +- Der `colorspace`-Filter wird nur verwendet, wenn die Quelle vollstaendige Farbraum-Metadaten liefert. Bei `unknown`-Metadaten wird der Filter uebersprungen, damit FFmpeg nicht abbricht. + +Forced-Subtitle-Beispiel: + +```text +Film_DEU51_ENG20.mov +Film_DEU51_ENG20_forced.srt +``` ## Konfiguration -Die wichtigsten Parameter stehen in `config.json`. Wenn die Datei fehlt, wird sie beim Start mit Default-Werten erzeugt. +Die wichtigsten Parameter stehen in [config.json](config.json). + +Default: ```json { @@ -152,9 +170,13 @@ Die wichtigsten Parameter stehen in `config.json`. Wenn die Datei fehlt, wird si "hd_bitrate": "30M", "hd_maxrate": "35M", "hd_bufsize": "50M", + "hd_level": "4.1", "sd_bitrate": "8M", "sd_maxrate": "10M", - "sd_bufsize": "15M" + "sd_bufsize": "15M", + "sd_level": "3.1", + "preset": "slow", + "tune": "film" }, "audio": { "mp4_bitrate": "256k", @@ -164,19 +186,29 @@ Die wichtigsten Parameter stehen in `config.json`. Wenn die Datei fehlt, wird si } ``` -FFmpeg wird in dieser Reihenfolge gesucht: +Hinweise: -1. Explizite Pfade aus `ffmpeg_exe` und `ffprobe_exe` -2. `PATH` -3. `C:\Tools\FFMPEG` -4. `C:\Software` +- `ffmpeg.ffmpeg_exe` und `ffmpeg.ffprobe_exe` koennen leer bleiben, dann wird automatisch gesucht. +- `output.base_dir` ueberschreibt die automatische Zielverzeichniswahl. +- Wenn `config.json` fehlt, wird sie beim Start mit Default-Werten erzeugt. -Das Zielverzeichnis wird so bestimmt: +## Fehlerbilder -1. `output.base_dir`, wenn gesetzt -2. erstes vorhandenes Verzeichnis aus `output.preferred_dirs`, standardmaessig `F:\VOD`, dann `H:\VOD` -3. falls keines existiert, der erste Preferred-Dir-Wert +Wenn eine Datei als Parameter uebergeben wird und der Pfad falsch ist, oeffnet sich kein Dialog. Stattdessen erscheint: -## Git-Hinweis +```text +FEHLER: Eingabedatei nicht gefunden: ... +``` -Die lokale `.env` enthält Zugangsdaten und wird absichtlich nicht versioniert. Neue Änderungen sollten zusammen mit einer passenden README-Aktualisierung committed und nach `main` gepusht werden. +Wenn keine deutsche Tonspur erkannt wird, muss der Dateiname ein deutsches Audio-Token enthalten, z.B.: + +```text +Film_DEU20.mov +Film_DEU51_ENG20.mov +``` + +## Repo-Pflege + +Die lokale `.env` enthaelt Zugangsdaten und wird nicht versioniert. + +Bei jeder Funktionsaenderung muss diese Anleitung aktuell gehalten werden. Neue Aenderungen sollen zusammen mit passender README-Aktualisierung committed und nach `main` gepusht werden.