Bring README in sync with current workflow

This commit is contained in:
Melbar
2026-05-07 18:32:14 +02:00
parent 37310d9335
commit bc6c3e83a7
+117 -85
View File
@@ -1,95 +1,103 @@
# Amazon PVD Mezzanine Encoder # Amazon PVD Mezzanine Encoder
**Automatisches Python-Tool zur Erstellung von Amazon PVD-konformen Mezzanine-VOD-Dateien und Audio-Master-Dateien** Automatisches Windows-Tool zur Erstellung von Amazon-PVD-Mezzanine-Dateien aus ProRes-, Blu-ray-, DVD- und anderen Videodateien.
(ProRes • Blu-ray • DVD • PAL • NTSC • Interlaced)
--- Das Tool erzeugt:
## Features - 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
- **Vollautomatische Erkennung** von SD/HD, PAL/NTSC und interlaced Material ## Aktueller Workflow
- **ProRes-Quellen mit mehreren Tonspuren** werden unterstuetzt
- **Audio-Sprache und Layout aus Dateinamen** (`DEU51_ENG20`, `DEU20`, usw.) 1. Quelle auswaehlen oder als Parameter uebergeben.
- **HD-PVD-MP4 mit 30 Mbit/s** und deutscher Stereo-Spur 2. FFprobe analysiert Video, Audio, Framerate, Aufloesung, Interlacing und Farbraum-Metadaten.
- **Automatischer Downmix** von deutscher 5.1-Spur auf Stereo, wenn keine deutsche Stereo-Spur vorhanden ist 3. Audio-Sprache und Layout werden bevorzugt aus dem Dateinamen gelesen, z.B. `DEU51_ENG20`.
- **Separate PCM-Audio-MOVs** fuer deutsche Tonspuren und originalsprachige Tonspuren 4. Das PVD-MP4 wird erzeugt.
- **Bester Deinterlacer** (`bwdif mode=0`) → saubere 25 fps bei PAL-DVDs (kein Double-Framerate) 5. Danach werden die Audio-MOVs erzeugt.
- **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)
## Voraussetzungen ## Voraussetzungen
- Windows (getestet) - Windows
- FFmpeg + FFprobe im `PATH`, in `C:\Tools\FFMPEG` oder in `C:\Software`
- Python 3.10+ - Python 3.10+
- Schreibzugriff auf den Ausgabeordner `F:\VOD` oder `H:\VOD` - FFmpeg und FFprobe
- Schreibzugriff auf das Zielverzeichnis
## Installation & Nutzung FFmpeg und FFprobe werden automatisch gesucht:
1. explizite Pfade aus `config.json`
2. `PATH`
3. `C:\Tools\FFMPEG`
4. `C:\Software`
## Starten
Interaktiv:
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 ```powershell
.\create_mezzanine.bat .\create_mezzanine.bat
``` ```
5. In der UI Quelle auswaehlen, analysieren und Encoding starten.
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. Mit direktem Dateiparameter:
Fuer automatisierte CLI-Laeufe kann das Encoding direkt gestartet werden:
```powershell ```powershell
py -3 .\pvd_mezzanine.py --cli "C:\Pfad\zur\Quelle.mov" .\create_mezzanine.bat "D:\Trailers\Film_DEU51_ENG20.mov"
``` ```
Alternativ kann die Datei direkt als erster Parameter uebergeben werden: Direkt per Python:
```powershell ```powershell
.\create_mezzanine.bat "C:\Pfad\zur\Quelle.mov" 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 ## Ausgabe
Das Script schreibt die fertige Mezzanine-Datei standardmäßig nach: Das Zielverzeichnis wird ueber `config.json` bestimmt:
```text 1. `output.base_dir`, wenn gesetzt
H:\VOD 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: Damit wird `F:\VOD` bevorzugt, wenn vorhanden. Sonst wird `H:\VOD` verwendet, wenn vorhanden.
```text Dateinamen:
_DEU20_PVD.mp4
```
Bei ProRes-Quellen werden zusaetzlich Audio-MOVs erzeugt:
```text ```text
Titel_DEU20_PVD.mp4
Titel_DEU_AUDIO_PCM.mov Titel_DEU_AUDIO_PCM.mov
Titel_OV_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: Beispiele:
@@ -106,30 +114,40 @@ Film_DEU20_DEU51.mov
- Spur 1: Deutsch 2.0 - Spur 1: Deutsch 2.0
- Spur 2: Deutsch 5.1 - 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. ## Audio-Regeln
Beispiel:
```text
Film.mkv
Film_forced.srt
```
## Audio-Ausgabe
- Das PVD-MP4 bekommt immer deutschen Stereo-Ton. - Das PVD-MP4 bekommt immer deutschen Stereo-Ton.
- Wenn eine deutsche 2.0-Spur vorhanden ist, wird sie verwendet. - Wenn eine deutsche 2.0-Spur vorhanden ist, wird diese verwendet.
- Wenn keine deutsche 2.0-Spur vorhanden ist, wird die erste deutsche Spur auf Stereo heruntergemischt. - Wenn keine deutsche 2.0-Spur vorhanden ist, wird die erste deutsche Spur per FFmpeg auf Stereo heruntergemischt.
- Alle deutschen Tonspuren werden als uncompressed PCM in eine separate MOV geschrieben. - Alle deutschen Tonspuren werden in eine MOV-Datei mit uncompressed PCM geschrieben.
- Alle nicht-deutschen Tonspuren werden als uncompressed PCM in eine separate MOV 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 ## 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 ```json
{ {
@@ -152,9 +170,13 @@ Die wichtigsten Parameter stehen in `config.json`. Wenn die Datei fehlt, wird si
"hd_bitrate": "30M", "hd_bitrate": "30M",
"hd_maxrate": "35M", "hd_maxrate": "35M",
"hd_bufsize": "50M", "hd_bufsize": "50M",
"hd_level": "4.1",
"sd_bitrate": "8M", "sd_bitrate": "8M",
"sd_maxrate": "10M", "sd_maxrate": "10M",
"sd_bufsize": "15M" "sd_bufsize": "15M",
"sd_level": "3.1",
"preset": "slow",
"tune": "film"
}, },
"audio": { "audio": {
"mp4_bitrate": "256k", "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` - `ffmpeg.ffmpeg_exe` und `ffmpeg.ffprobe_exe` koennen leer bleiben, dann wird automatisch gesucht.
2. `PATH` - `output.base_dir` ueberschreibt die automatische Zielverzeichniswahl.
3. `C:\Tools\FFMPEG` - Wenn `config.json` fehlt, wird sie beim Start mit Default-Werten erzeugt.
4. `C:\Software`
Das Zielverzeichnis wird so bestimmt: ## Fehlerbilder
1. `output.base_dir`, wenn gesetzt Wenn eine Datei als Parameter uebergeben wird und der Pfad falsch ist, oeffnet sich kein Dialog. Stattdessen erscheint:
2. erstes vorhandenes Verzeichnis aus `output.preferred_dirs`, standardmaessig `F:\VOD`, dann `H:\VOD`
3. falls keines existiert, der erste Preferred-Dir-Wert
## 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.