Film transcodieren in MPEG4

Die Idee zu diesem Script ist mir gekommen, nachdem ich von einem Freund einen AVI-Film bekam, der vor nur 6 Jahren aufgezeichnet wurde und dessen Ton nicht einmal mehr von den liberalsten Videoplayern wieder gegeben werden konnte. Dadurch wurde meine Aufmerksamkeit auf die Nachhaltigkeit gelenkt, die durch die verwendeten Codec's begrenzt wird.

Aus dem Grund sollten meine archivierten Filme folgenden Eigenschaften aufweisen:

  1. Platz sparender Video-Codec (in bester Qualität soll er weniger als 50% Plattenplatz benötigen gegenüber MPEG-2 bzw. DVD);
  2. auch in ferner Zukunft noch abspielbar sein;
  3. der Film soll in einer einzigen Datei abgelegt werden (bei VCD, DVD und Blu-ray werden die Filme in mehreren Dateien innerhalb einer Verzeichnisstruktur gespeichert);

Punkt 1 ist nur mit modernen Codec's zu erreichen, allen voran der H.264 bzw. der freie x264. Mit dem freien Codec Theora von der Xiph.Org Foundation ist das nur schwer zu erreichen, Dirac bzw. Schrödinger von der BBC und Tarkin von der Xiph.Org Foundation sind da schon eine bessere Wahl, allerdings sind all diese Codec's noch in einem relativ frühen Entwicklungsstadium und wie es dann mit Punkt 2 (Zukunftssicherheit) aussieht ist auch noch sehr fraglich. Eine weitere Alternative zum x264, gibt es neuerdings auch noch (zum Zeitpunkt meiner Entscheidungsfindung gab es diese Alternative jedoch noch nicht), der VP8. Allerdings sind all diese nicht ganz so gut wie der x264 und des weiteren sind sie auch noch sehr frisch und welcher sich von all den x264-Alternativen in Zukunft tatsächlich behaupten wird, bleibt abzuwarten… und warten kann ich nicht, da meine Platten voll laufen! :-(

Punkt 2 konnte in der Vergangenheit nur mit VCD und DVD erreicht werden, in Zukunft werden diese beiden Standard's von Blu-ray abgelöst.

Aus beiden Gründen bleibt dann für die private Nutzung nur noch der x264 Konkurrenzlos übrig. Der x264 kann seit Mitte 2010 auch Blu-ray-kompatible Filme erzeugen.

Punkt 3 kann mit dem Standard AVCHD erreicht werden, der beschreibt wie ein Blu-ray-kompatibler Film in einer einzigen Datei gespeichert wird.

Die Große Gruppe der MPEG-4 - kompatiblen Formate, mit dem neuen Codec H.264 heißt AVC, Blu-ray und AVCHD sind davon nur eine kleine Untermenge. Das bedeutet, AVCHD-Dateien werden immer auch von AVC-Videoplayern abspielbar sein, soweit jedenfalls die Theorie.

Somit ist das Format meiner Wahl bis hierhin AVCHD. Allerdings gibt es auch hier noch einen Pferdfuß, Der Blu-ray- und AVCHD-Standard enthalten nur eine sehr kleine Auswahl an Bildauflösungen, bei AVC gibt es hierfür nur eine sehr einfach einzuhaltende Vorschrift für das Verhältnis zwischen Bildbreite und Bildhöhe. Das kompatibelste AVCHD-Format ist das AVCHD-Lite, es ist praktisch in allen genannten HD-Definitionen enthalten. Innerhalb dieses Unterstandard's ist das kleinste Format mit progressiven Bildern, das 720p (progressives Bild mit 720 Zeilen).

Will ich nun 100% AVCHD-kompatibel (und AVCHD-Lite-kompatibel sowie AVC- und Blu-ray-kompatibel) sein, müsste ich alle meine 720x576i-Filme von meinem DVD-HDD-Recorder sowie meine 640x480i-Filme von meiner DigiCam in genau dieses Format hoch scalieren. Das ist natürlich Blödsinn, denn dann würde ich kein besseres Bild bekommen, sondern nur eine deutlich größere Datei und somit Punkt 1 auch mit diesem (zur Zeit besten) Codec nicht mehr erreichen können. Nach meinen Tests benötigen diese AVCHD-720p-Filme genau so viel Platz wie die MPEG2-Filme im 720x576i-Format (DVD).

Also habe ich mich entschieden, in allen Punkten, außer der Auflösung dem Blu-ray- bzw. AVCHD-Standard zu folgen. In der Auflösung allerdings nur dem AVC-Standard, denn die bleibt wie sie ist, ich werde die 480i- und 576i-Filme allerdings in 480p- und 576p-Filme (diesen Standard gibt es allerdings nicht) umwandeln, da sie dann am PC deutlich besser aussehen.

Damit erzeuge ich Filmdateien, die 100% AVC-konform sind und dessen Datenstrom sogar von den HardWare-Blu-ray-Encodern verstanden werden sollte. Die Original-Auflösung wird dabei unverändert übernommen. Damit sollten alle meine archivierten Filme auch in 30 Jahren noch (mind. auf dem PC) abspielbar sein, sicherlich aber auch auf diversen, wenn nicht allen, MediaBoxen.

Für Spielfilme ist das nicht so wichtig, aber für die Familienfilme ist das schon sehr wichtig.

Dieses Script ist für genau diesen Zweck geschrieben worden. Ich habe ca. 3 Jahre gebraucht um all diese Informationen und Erfahrungen zusammen zu tragen, die zum schreiben dieses Scripts nötig waren. Alleine die Tests, für die beste Kombination der zur Verfügung stehenden Programme, haben über 2 Jahre gedauert.

Jetzt erweitere ich das Script gelegentlich noch um interessante Funktionen und beseitige Fehler, wenn ich sie finde oder mich jemand darauf aufmerksam macht (was bis jetzt jedoch noch nicht geschah).

Parameterbeschreibung


   -aid 129

In jeder Videodatei sind die Video- oder Audio-Spuren jeweils mit einer ID gekennzeichnet. Will man eine ganz bestimmte Audio-Spur (dessen ID bekannt ist) für den neuen Film auswählen, dann übergibt man die Audio-ID mit diesem Parameter. Als Standard wird sonst die erste gefundene Ton-Spur ausgewählt. siehe auch “-ts“


   -as

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Mit diesem Parameter wird eine automatische Längenanpassung durch Audio-stretch aktiviert. Hierbei wird die Audiodatei soweit beschleunigt oder gebremst, dass Audio- und Video-Spur wieder die gleiche Spielzeit haben.


   -aq 7

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Hiermit werden die Standardeinstellungen überschrieben. Tonqualität manuell setzen: 0-10

niedrigste Qualität: 0
höchste Qualität: 10

   -c 704:432:08:72

Dieser Parameter übernimmt die CROP-Werte. Wenn ein Film oben und unten bzw. links und rechts einen schwarzen Balken hat und man diesen entfernen möchte, dann braucht man diesen Parameter.

Zum Beispiel kann es sein das ein 16/9-Film im PAL-Fernsehen gezeigt wird, dann hat er oben und unten jeweils einen schwarzen Balken von ca. 72 Bildpunken sowie links und rechts von jeweils ca. 8 Bildpunkten.

In diesem Fall müssen die nötigen CROP-Werte wie folgt zusammen gestellt werden.

Das gesamte PAL-Bild hat eine Auflösung von 720×576 Bildpunkten, der eigentliche Film wird aber nur auf 704×432 Bildpunkten dargestellt.

Wenn der Film genau in der Mitte vom Bildschirm justiert ist (was selten der Fall ist), dann können wir folgende Rechnungen auf machen:

linker schwarzer Balken: (720 - 704) / 2 = 08
oberer schwarzer Balken: (576 - 432) / 2 = 72

Damit wird die linke obere Filmecke mit „08:72“ bezeichnet.

Das Format des eigentlichen Films wird mit „704:432“ bezeichnet.

Daraus ergeben sich die CROP-Parameter: “-c 704:432:08:72“


   -dar 16/9

Die Display Aspect Ratio (DAR) gibt das Anzeigeseitenverhältnis eines einzelnen Bildes in einem Digitalvideo an. Der Parameter für ein 16/9-Film würde so übergeben werden: -dar 16/9


   -dtton

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Dieser Parameter heißt „Delay-Transcodierter-TON“. Er verzögert das einsetzen der transcodierten Ton-Spur in ms. Will man die Ton-Spur zum Beispiel um 1,3 Sekunden verzögert starten lassen, dann würde der Parameter so aussehen: “-dtton 1300“


   -doton

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Dieser Parameter heißt „Delay-Original-TON“. Er verzögert das einsetzen der originalen Ton-Spur in ms. Das ist sinnvoll, wenn man den 5.1-Ton des Originalvideos bei behalten möchte.


   -dvideo 1000

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Er verzögert das einsetzen der Video-Spur in ms.


   -di

Dieser Parameter sollte nur bei einem Quellvideo mit Zeilensprungverfahren benutzen werden! Er interpoliert das Bild zu einem progressiven Bild, dadurch sehen die Filme am Rechner deutlich besser aus.


   -fps 20

Hiermit wird die Anzahl der gewünschten anzuzeigenden Bilder pro Sekunde für den neuen Film fest gelegt. Zum Beispiel 15, 20, 25 oder 30; will man 20 Bilder pro Sekunde im neuen Film haben, dann sieht der Parameter dafür so aus: “-fps 20“


   -h

Zeigt eine kurze HILFE mit ein paar Beispielen.


   -k 4

Dieser Parameter bedeutet CPU-Kerne, die zum berechnen des Filmmaterials verwendet werden sollen. Mehr Kerne bedeutet eine schneller Bearbeitung. Weniger Kerne bedeutet eine bessere Qualität, deshalb wird per Standard nur auf einem Kern gerechnet. mögliche Werte: 1-16 Hiermit werden die Standardeinstellungen überschrieben.


   -mkvsync

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. automatische Laufzeitsyncronisation zwischen Audio- und Video-Spur wird durch interne Werte im MKV-Container syncronisiert. Hierbei wird die Audio-Spur nicht verändert. Dieser Parameter deaktiviert die automatische Syncronisation auf diesem Weg.


   -oton

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Hiermit wird die Original-Tonspur, im neuen Video, mit übernommen. Das ist sinnvoll, wenn man den 5.1-Ton des Originalvideos bei behalten möchte.


   -p sp3xv

Diser Parameter bedeutet PROFIL, mit ihm werden voreingestellte Were zum transcodieren ausgewählt.

Zur Zeit werden folgende Profile unterstützt:

  1. avc (MPEG-4 Advanced Video Coding)
  2. asp (MPEG-4 Advanced Simple Profile)
  3. sp3dx (MPEG-4 Simple-Profil Level 3 mit DivX-Codec)
  4. sp3xv (MPEG-4 Simple-Profil Level 3 mit Xvid-Codec)
  5. sp5dx (MPEG-4 Simple-Profil Level 5 mit DivX-Codec)
  6. sp5xv (MPEG-4 Simple-Profil Level 5 mit Xvid-Codec)
  7. em880 (MPEG-4 Simple-Profil Level 3 mit Xvid-Codec, jedoch mit 20 Bildern pro Sekunde, optimiert für den Miniplayer „EM880RB“)
  8. x264 (H.264-kompatibel; Synonym für avc)
  9. xvid (Synonym für asp mit Xvid-Codec)
  10. divx (Synonym für asp mit DivX-Codec)
  11. dx50 (Synonym für asp mit DivX-Codec und ffourcc DX50)

   -par pal

Die Pixel Aspect Ratio (PAR) gibt das Pixelseitenverhältnis, also das Verhältnis von Breite zu Höhe eines einzelnen Bildpunktes (Pixel) des Ausgabemediums an. Der Parameter für ein PAL-Film würde so übergeben werden: “-par pal“

Es können auch Brüche oder Fließkommzahlen übergeben werden, zum Beispiel sind diese Parameter möglich: ntsc, pal, dvb, 16/15, 1.0666666666


   -q Die_Legende_von_Beowolf.mpg

Name der Quell-Video-Datei, hiermit wird das Quellvideo übergeben, dieser Parameter ist zwingend erforderlich! zum Beispiel: “-q Film.mpg“


   -r 300

Rauschunterdrückung, Werte zwischen 100 und 600 werden von den Entwicklern empfohlen.


   -s 320x240

Film-Format auf diesen Wert scalieren


   -ts 2

Nummer der gewünschten Tonspur, die Audio-ID wird dann automatisch ermittelt. Als Standard wird sonst die erste gefundene Ton-Spur ausgewählt. siehe auch “-aid“


   -vq 7

Dieser Parameter funktioniert nur mit dem AVC/x264-Codec. Hiermit werden die Standardeinstellungen überschrieben. Bildqualität manuell setzen: 0-10

niedrigste Qualität: 0
höchste Qualität: 10

   -z Die_Legende_von_Beowolf_-_klein

Name des Zielvideos ohne Endung, die wird automatisch gesetzt. Andererseits wird der Name des Originalvideo's mit einigen Zusätzen verwendet.

ToDo / Probleme

Zur Zeit ist es nicht möglich, diesem Script die Anweisung zu übergeben, mehr als eine Tonspur zu transcodieren und ggf. noch unverändert zu übernehmen.

Das wird erst in späteren Versionen möglich sein.

Beispiele

Hilfe

Hilfe anzeigen:

# /home/bin/film_transcodieren_mpeg4.sh -h

AVC

Es muss mindestens der Parameter “-q“ (Quelldatei ⇒ Originalfilm) gesetzt werden:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg

wenn man will, dann kann man das Profil auch noch extra angeben:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -p avc
# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -p x264

mit dem Parameter “-z“ kann man den gewünschten Name des Zielvideos (ohne Endung) angeben:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -z Alf

dieser interlaced 4/3-PAL-Film soll in einen progressiven (deinterlacing-Parameter: “-di“) Breitwandfilm ohne überflüssige schwarze Füllpixel umgewandelt werden:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -c 720:432:0:72 -par pal

Ohne Norm-Angabe (-par pal / -par ntsc / -par dvb) und ohne Aspekt bzw. Seitenverhältnisangabe (-dar 16/9), wird von quadratischen Bildpunkten ausgegangen (Blu-ray-Standard)! Wenn der Aspekt nicht vernünftig in der originalen Filmdatei hinterlegt ist (was meistens der Fall ist), sollte unbedingt noch einer der beiden Parameter angegeben werden! Sonst stimmt am Ende das Seitenverhältnis nicht mehr.

PAL- und NTSC-Filme werden in der Regel im Zeilensprungverfahren (interlace) dargestellt, hier würde ich den Parameter zum deinterlacen und deblocken (-di) noch aktivieren, damit am Ende in progressives Bild raus kommt, das sieht am PC deutlich besser aus (keine Kammbildung mehr):

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -c 720:432:0:72 -par pal -di

dieser PAL-Film soll in einen Breitwandfilm ohne überflüssige schwarze Füllpixel auf 320×240 Bildpunkten scaliert, bei 15 Bildern pro Sekunde umgewandelt werden:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -c 720:432:0:72 -par pal -di -s 320x240 -fps 15

dieser Film soll in einen Breitwandfilm ohne überflüssige schwarze Füllpixel mit erzwungenem 16/9-Format mit 320×288 Bildpunkten bei 20 Bildern pro Sekunde umgewandelt werden:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -c 720:432:0:72 -s 320x288 -dar 16/9 -fps 20

soll nicht die erste Tonspur, sondern die zweite (egal welche ID sie wirklich hat), dann übergibt man das so:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -ts 2

wenn die Tonspuren automatisch in der Länge angepasst werden sollen, muss man beide Längenanpassungsmethoden aktivieren:

# /home/bin/film_transcodieren_mpeg4.sh -di -q film.mpg -as -mkvsync
  1. mit “-as“ wird die automatische Längenanpassung durch Audio-stretch aktiviert, hierbei würde ggf. die Tonspur verändert werden;
  2. mit “-mkvsync“ automatische Laufzeitsyncronisation zwischen Audio- und Video-Spur durch den MKV-Container aktivieren;

die Zielqualitäten der Audio- bzw. der Videospur kann auch durch Parameter beeinflusst werden, hier ein Beispiel für eine recht kleine Zieldatei mit verringerter Qualität:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -aq 4 -vq 4

eilt das Bild der transcodierten AAC-Tonspur um 1,3 Sekunden voraus, dann korrigiert man das so:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -dtton 1300

soll die Originaltonspur mit übernommen werden, um z.B. den 5.1-Sound zu erhalten, dann genügt der zusätzliche Parameter “-oton“:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -oton

eilt das Bild dem unveränderte Original-Ton um 0,2 Sekunden voraus, dann korrigiert man das so:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -oton -doton 200

eilt der Ton dem Bild um 0,3 Sekunden voraus, dann korrigiert man das so:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -dvideo 300

Bei Verwendung von nur einem einzigen Rechenkern ist die Qualität minimal besser als bei Verwendung von mehreren Kernen. Will man aber Zeit sparen, kann man auch mehrere Rechenkerne verwenden:

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -k 4

hat man einen Film aus dem Fernsehen bei schlechten Witterungsverhältnissen aufgenommen, so dass das Bild etwas verrauscht ist, dann kann man ein Wert zur Rauschunterdrückung übergeben (Parameter “-r“):

# /home/bin/film_transcodieren_mpeg4.sh -q film.mpg -par pal -di -r 200

Der Deinterlacing-Parameter “-di“ bietet sich bei SD-Aufnahmen (keine HD-Aufnahmen) aus dem TV an, da diese interlaced sind. HD-Aufnahmen können interlaced sein (z.B. 576i, 1080i), sollten aber bereits progressiv sein (z.B. 720p, 1080p).

ASP

einen Film in den ASP-Standard mit DivX-Codec transcodieren:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p divx

einen Film in den ASP-Standard mit DivX5-Codec transcodieren:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p dx50

einen Film in den ASP-Standard mit Xvid-Codec transcodieren:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p xvid

SP

einen Film für einen MiniPlayer transcodieren:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p sp3xv
# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p sp3dx

einen Film für meinen MiniPlayer „entryx EM880RB“ transcodieren:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p 880

das gleiche, nur mit etwas verringerter Qualität (dadurch erhält man auch eine kleinere Datei), die aber für die Miniplayer noch voll und ganz ausreicht:

# /home/bin/film_transcodieren_mpeg4.sh -q Film.mkv -p 880 -s 320x240 -fps 15 -aq 1 -vq 1

film_transcodieren_mpeg4.sh

film_transcodieren_mpeg4.sh.gz

#!/usr/bin/env bash
VERSION="2012050500"
#------------------------------------------------------------------------------#
# Dieses Skript kann Video-Dateien in verschiedenen Video-Codec's erstellen,
# z.B. "DivX 4/5", "Xvid" und "AVC" (mit x264).
# Auch verschiedene Audio-Codec's sind möglich,
# z.B. "MP2" (nur 'Simple Profile 3'), "MP3", "OGG" oder "AAC".
#
# Im Standard werden "AVC"-Filme erstellt, die "Divx Plus"-kompatibel sind
# und zum Teil auch dem "AVCHD"- und "Blue-Ray"-Standard entsprechen.
# Es wird lediglich mit den Einschränkungen in Bezug auf die erlaubten
# Auflösungen, Audio-Codec's und den Video-Containern gebrochen.
# Damit sollten diese Dateien potentiell mit jedem Player abgespielt werden
# können, der "Blue-Ray"-, "AVCHD"- und "MKV"-Dateien abspielen kann.
#
# http://www.os4.org/wiki/film_transcodieren_in_mpeg4.html
#
# Sollten Sie einen Player für den PC suchen, der diese Filme abspielen kann,
# dann probieren sie doch mal den VLC aus:
# http://www.vlc.de/
# http://www.videolan.org/vlc/
#------------------------------------------------------------------------------#
### AVC-Profil
PROFILE="high"                          # Standardwert: es wird zur Zeit nur das Profil "high" unterstützt
### Standardwerte für nicht übergebene Parameter
AS="NEIN"                               # im Standard kein Audio-stretch, zu aktivieren mit "-as"
LDIFF="0.1"                             # nur bei "-as": Spurlängendifferenzen, die größer sind als dieser Wert in %, werden durch Audiomodifikation ausgeglichen
DELAYOTON="0"                           # im Standard kein versetztes einsetzen der Originaltonspur, zu aktivieren mit z.B.: "-doton 1000"
DELAYTRANSTON="0"                       # im Standard kein versetztes einsetzen der transkodierten Tonspur, zu aktivieren mit z.B.: "-dtton 1000"
MKVSYNC="JA"                            # im Standard Synchronisation durch den MKV-Container, zu deaktivieren mit: "-mkvsync"
NUTZKERNE="1"                           # Standardwert (mögliche Werte für die nutzbaren Kerne: "0" für automatisch, und für feste Zuweisung "1"-"16")
PPROFIL="avc"                           # im Standard wird ein AVC-Film erzeugt, zu ändern mit z.B.: "-p asp"
RAUSCH="0"                              # im Standard wird keine Rauschunterdrückung aktiviert, zu aktivieren mit z.B.: "-r 100"
TRELLIS="2"                             # zum testen Trellis deaktivieren
UNTERTI="-nosub"                        # Untertitel muss gezielt eingeschaltet werden
### Standardwerte für das temporären Zwischenformates beim erstellen von Filmen für einen MiniPlayer
ZBB="768"                               # Grenzwert für die Bildbreite, bis wann das erstellen eines temporären Zwischenformates beim erstellen von Filmen für einen MiniPlayer, noch nicht erforderlich ist (empirisch ermittelter Wert)
ZBH="576"                               # Grenzwert für die Bildhöhe, bis wann das erstellen eines temporären Zwischenformates beim erstellen von Filmen für einen MiniPlayer, noch nicht erforderlich ist (empirisch ermittelter Wert)
ZQP="20"                                # Standardwert für die Videoqualität des temporären Zwischenformates beim erstellen von Filmen für einen MiniPlayer (mögliche Werte für den Quantisierungsparameter: "0"-"51"; "0" ist ''verlustfrei'' und wegen der großen Datenmengen, recht langsam; "51" ist sehr rechenintensiv)
#------------------------------------------------------------------------------#
PARAMETER="${@}"
if [ "${#}" -eq "0" ] ; then
        echo "
        HILFE:
        ${0} -h
        "
        exit 0
fi
while [ "${#}" -ne "0" ] ; do
        case "$1" in
                -aid)
                        SOLLAUDIOID="${2}"                      # die Audio-ID, die in der Video-Datei drin steht
                        shift
                        ;;
                -sid)
                        UNTERTI="-sid ${2}"                     # die Untertitel-ID, die in der Video-Datei drin steht
                        shift
                        ;;
                -as)
                        AS="JA"                                 # (nur für AVC/x264) automatische Längenanpassung durch Audio-stretch aktivieren
                        shift
                        ;;
                -aq)
                        SOLLTONQUALIT="${2}"                    # (nur für AVC/x264) Tonqualität manuell setzen: 0-10
                        shift
                        ;;
                -c)
                        # mencoder (crop=width:height:left:top): -vf crop=704:428:12:72
                        # x264 (crop:left,top,right,bottom):    --vf crop:12,72,4,76
                        CROP="${2}"                             # Werte von "mplayer Film.vob -vf cropdetect" z.B.: "704:462:08:54" (720x576) oder "704:432:08:72" (720x576) oder "704:340:08:118" (720x576) oder "704:340:08:70" (720x480) oder "640:288:0:96" (640x480)
                        shift
                        ;;
                -dar)
                        SOLLASPECT="${2}"                       # Seitenverhältnis des gesamten Bildes: -dar 16/9
                        PAR=""
                        shift
                        ;;
                -dtton)
                        DELAYTRANSTON="$2"                      # (nur für AVC/x264) Verzögerung der transcodierten Tonspur(en) in ms
                        shift
                        ;;
                -doton)
                        DELAYOTON="$2"                          # (nur für AVC/x264) verzögertes einsetzen der Original-Tonspur
                        shift
                        ;;
                -dvideo)
                        DELAYVIDEO="$2"                         # (nur für AVC/x264) verzögertes einsetzen der Video-Spur
                        shift
                        ;;
                -di)
                        DEINTERLACER="ci/hb/vb/dr/al"           # progressives Bild interpolieren, nur bei Zeilensprungverfahren benutzen!
                        shift
                        ;;
                -fps)
                        FPS="${2}"
                        shift
                        ;;
                -test)
                        TRELLIS="0"                             # zum testen wird Trellis beim x264 abgeschaltet
                        PPROFIL="test"                          # Testprofil
                        shift
                        ;;
                -h)
                        echo "
                        HILFE:
                        ${0} -h
                        
                        ASPECT:
                                -dar 16/9
                        ID der gewünschten Tonspur (Audio-ID):
                                -aid 128
                        Audioqualität (Std.: 5; mögliche Werte: 0-10):
                                -aq 5
                        Videoqualität (Std.: 7; mögliche Werte: 0-10):
                                -vq 5
                        CROP-Werte:
                                -c 720:432:0:72
                        (nur für AVC/x264) ein um 1300ms (1,3 Sekunden) verzögertes einsätzen der transcodierten Tonspur:
                                -dtton 1300
                        (nur für AVC/x264) ein um 200ms (0,2 Sekunden) verzögertes einsätzen der Original-Tonspur:
                                -doton 200
                        (nur für AVC/x264) ein um 300ms (0,3 Sekunden) verzögertes einsätzen der Video-Spur:
                                -dvideo 300
                        Deinterlacing:
                                -di 
                        Bilder pro Sekunde im Zielvideo:
                                -fps 20
                        HILFE:
                                -h
                        CPU-Kerne:
                                -k 1
                        (nur für AVC/x264) automatische Längenanpassung durch Audio-stretch aktivieren:
                                -as
                        (nur für AVC/x264) automatische Laufzeitsyncronisation zw. Audio- und Video-Spur durch MKV-Container-Parameter deaktivieren:
                                -mkvsync
                        der Pixel-Aspect PAR:
                                -par ntsc       (720x480 wird so dargestellt wie 640x480)
                                -par pal        (720x576 wird so dargestellt wie 768x576)
                                -par dvb        (720x576 wird so dargestellt wie 1024x576)
                                -par 16/15      (als Bruch angeben)
                                -par 1.0666666  (als Fliesskommazahl angeben)
                        (nur für AVC/x264) Original-Tonspur mit übernehmen:
                                -oton
                        Profil:
                                -p avc          (synonym für x264; das ist der Standard, wenn kein Profil angegeben wird)
                                -p x264         (Video-Codec: x264 / Audio-Codec: AAC)
                                -p xmp3         (Video-Codec: x264 / Audio-Codec: MP3)
                                -p xogg         (Video-Codec: x264 / Audio-Codec: OGG)
                                -p asp          (synonym für xvid)
                                -p divx         (Video-Codec: DivX 4/5 / Audio-Codec: MP3)
                                -p dx50         (Video-Codec: DivX 5 / Audio-Codec: MP3)
                                -p sp3dx        (Video-Codec: DivX 5 / Audio-Codec: MP2)
                                -p xvid         (Video-Codec: Xvid / Audio-Codec: MP3)
                                -p sp3xv        (Video-Codec: Xvid / Audio-Codec: MP2)
                                -p em880        (Video-Codec: Xvid / Audio-Codec: MP2; optimiert für den MiniPlayer 'entryx EM880RB')
                                -p sp5dx        (Video-Codec: Xvid / Audio-Codec: MP3')
                                -p sp5xv        (Video-Codec: Xvid / Audio-Codec: MP3)
                                -p sqcif        (-s 128x96)
                                -p qcif         (-s 176x144)
                                -p qvga         (-s 320x240)
                                -p cif          (-s 352x288)
                                -p vga          (-s 640x480)
                                -p 4cif         (-s 704x576)
                        Name der Quell-Video-Datei:
                                -q Alf.mpg
                        Rauschunterdrückungswert:
                                -r 100
                        Bild auf diesen Wert scalieren:
                                -s 640x512
                        Nummer der gewünschten TonSpur:
                                -ts 2
                        Name des Zielvideos (ohne Endung):
                                -z Alf_avc
                        
                        z.B.:
                        Es muss mindestens dieser Parameter gesetzt werden:
                        ${0} -q film03.mpg
                        ${0} -q film02.mpg -c 716:426:2:74
                        ${0} -q film01.mpg -c 720:432:0:72 -s 320x288 -dar 16/9 -fps 20
                        ${0} -q film01.mpg -c 720:432:0:72 -s 320x240 -di -par pal
                        MPEG 4 Part 10 (x264 / AAC); es muss kein Profil angegeben werden:
                        ${0} -q film02.mpg
                        MPEG 4 Part 10 (x264 / MP3):
                        ${0} -q film02.mpg -p xmp3
                        MPEG 4 Part 10 (x264 / OGG):
                        ${0} -q film02.mpg -p xogg
                        MPEG 4 Part 2 (Xvid):
                        ${0} -q film02.mpg -p asp
                        ${0} -q film02.mpg -p xvid
                        MPEG 4 Part 2 (DivX 4/5 - kompatibel):
                        ${0} -q film02.mpg -p divx
                        MPEG 4 Part 2 (DivX 5 - kompatibel):
                        ${0} -q film02.mpg -p dx50
                        simple profile at level 3 (allgemein für MiniPlayer / DivX 5):
                        ${0} -q film02.mpg -p sp3dx
                        simple profile at level 3 (allgemein für MiniPlayer / Xvid):
                        ${0} -q film02.mpg -p sp3xv
                        für einen MiniPlayer 'entryx EM880RB' (Xvid):
                        ${0} -q film02.mpg -p em880
                        "
                        exit 0
                        ;;
                -k)
                        NUTZKERNE="${2}"                        # (mögliche Werte: 1-16) CPU-Kerne zum berechnen; mehr: schneller; weniger: bessere Qualität
                        shift
                        ;;
                -mkvsync)
                        MKVSYNC="NEIN"                          # (nur für AVC/x264) automatische Laufzeitsyncronisation zw. Audio- und Video-Spur durch MKV-Container-Parameter aktivieren
                        shift
                        ;;
                -oton)
                        OTON="JA"                               # (nur für AVC/x264) Original-Tonspur mit übernehmen
                        shift
                        ;;
                -p)
                        PPROFIL="${2}"                          # avc, asp, sp3dx, sp3xv, sp5dx, sp5xv, em880, x264, xvid, divx, dx50
                        shift
                        ;;
                -par)
                        PAR="${2}"                              # Seitenverhältnis des einzelnen Bildpunktes: NTSC, PAL oder DVB
                        SOLLASPECT=""
                        shift
                        ;;
                -q)
                        ORIGINAL="${2}"                         # Name der Quell-Video-Datei
                        shift
                        ;;
                -r)
                        RAUSCH="${2}"                           # Wert für die Rauschunterdrückung
                        shift
                        ;;
                -s)
                        # Bild auf diesen Wert scalieren: z.B.: 640x512
                        BILDBREITE="$(echo "${2}" | awk -F'x' '{printf("%u\n",($1/2))}' | awk '{printf("%u\n",($1*2))}')"
                        BILDHOEHE="$(echo "${2}" | awk -F'x' '{printf("%u\n",($2/2))}' | awk '{printf("%u\n",($1*2))}')"
                        shift
                        ;;
                -ts)
                        TSN="${2}"                              # Nummer der gewünschten Tonspur, die Audio-ID wird dann automatisch ermittelt
                        shift
                        ;;
                -vq)
                        SOLLBILDQUALIT="${2}"                   # (nur für AVC/x264) Bildqualität manuell setzen: 0-10
                        shift
                        ;;
                -z)
                        SOLLNAME="${2}"                         # Name des Zielvideos
                        shift
                        ;;
                *)
                        if [ "$(echo "${1}"|egrep '^-')" ] ; then
                                echo "Der Parameter '${1}' wird nicht unterstützt!"
                                ABBRUCH="Ja"
                        fi
                        shift
                        ;;
        esac
done
#------------------------------------------------------------------------------#
### es geht nicht weiter
if [ -n "${ABBRUCH}" ] ; then
        echo "ABBRUCH!"
        exit 1
fi
#------------------------------------------------------------------------------#
### Nummer der Tonspur, Standard ist "1"
if [ -z "${TSN}" ] ; then
        TSN="1"
fi
#------------------------------------------------------------------------------#
# Profildaten fest legen
case "${PPROFIL}" in
        test)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ANPASSUNG="nein"
                ;;
        avc)
                VPROG="x264 mkvmerge"
                APROG="faac"
                AUDIOCODEC="aac"
                CONTAINER="mkv"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        x264)
                VPROG="x264 mkvmerge"
                APROG="faac"
                AUDIOCODEC="aac"
                CONTAINER="mkv"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        xmp3)
                VPROG="x264 mkvmerge"
                APROG="lame"
                AUDIOCODEC="mp3"
                CONTAINER="mkv"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        xogg)
                VPROG="x264 mkvmerge"
                APROG="oggenc"
                AUDIOCODEC="ogg"
                CONTAINER="mkv"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        asp)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        divx)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        dx50)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        sp3dx)
                AUDIOCODEC="mp2"
                CONTAINER="avi"
                PBILDQUALIT="3"
                PTONQUALIT="3"
                PBILDBREITE="320"
                PBILDHOEHE="240"
                PFPS="15"
                ANPASSUNG="nein"
                ;;
        xvid)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                ;;
        sp3xv)
                AUDIOCODEC="mp2"
                CONTAINER="avi"
                PBILDQUALIT="3"
                PTONQUALIT="3"
                PBILDBREITE="320"
                PBILDHOEHE="240"
                PFPS="15"
                ANPASSUNG="nein"
                ;;
        em880)
                AUDIOCODEC="mp2"
                CONTAINER="avi"
                PBILDQUALIT="3"
                PTONQUALIT="3"
                PBILDBREITE="320"
                PBILDHOEHE="240"
                PFPS="20"
                ANPASSUNG="nein"
                ;;
        sp5dx)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                PBILDBREITE="720"
                PBILDHOEHE="576"
                ANPASSUNG="nein"
                ;;
        sp5xv)
                AUDIOCODEC="mp3"
                CONTAINER="avi"
                PBILDQUALIT="5"
                PTONQUALIT="5"
                PBILDBREITE="720"
                PBILDHOEHE="576"
                ANPASSUNG="nein"
                ;;
        sqcif)
                PBILDBREITE="128"
                PBILDHOEHE="96"
                ;;
        qcif)
                PBILDBREITE="176"
                PBILDHOEHE="144"
                ;;
        qvga)
                PBILDBREITE="320"
                PBILDHOEHE="240"
                ;;
        cif)
                PBILDBREITE="352"
                PBILDHOEHE="288"
                ;;
        vga)
                PBILDBREITE="640"
                PBILDHOEHE="480"
                ;;
        4cif)
                PBILDBREITE="704"
                PBILDHOEHE="576"
                ;;
        *)
                echo "
                aus folgenden Profilen kann eines ausgewählt werden:
                -p avc          (synonym für x264; das ist der Standard, wenn kein Profil angegeben wird)
                -p x264         (Video-Codec: x264 / Audio-Codec: AAC)
                -p xmp3         (Video-Codec: x264 / Audio-Codec: MP3)
                -p xogg         (Video-Codec: x264 / Audio-Codec: OGG)
                -p asp          (synonym für xvid)
                -p divx         (Video-Codec: DivX 4/5 / Audio-Codec: MP3)
                -p dx50         (Video-Codec: DivX 5 / Audio-Codec: MP3)
                -p sp3dx        (Video-Codec: DivX 5 / Audio-Codec: MP2)
                -p xvid         (Video-Codec: Xvid / Audio-Codec: MP3)
                -p sp3xv        (Video-Codec: Xvid / Audio-Codec: MP2)
                -p em880        (Video-Codec: Xvid / Audio-Codec: MP2; optimiert für den MiniPlayer 'entryx EM880RB')
                -p sp5dx        (Video-Codec: Xvid / Audio-Codec: MP3)
                -p sp5xv        (Video-Codec: Xvid / Audio-Codec: MP3)
                -p sqcif        (-s 128×96)
                -p qcif         (-s 176×144)
                -p qvga         (-s 320x240)
                -p cif          (-s 352×288)
                -p vga          (-s 640x480)
                -p 4cif         (-s 704×576)
                ABBRUCH
                "
                exit 1
                ;;
esac
if [ "${CONTAINER}" == "mkv" ] ; then
        if [ "${AS}" == "JA" ] ; then
                ASTRETCH="soundstretch"
        fi
fi
#------------------------------------------------------------------------------#
# gewünschte Soll-Parameter werden gesetzt
if [ -n "${SOLLBILDQUALIT}" ] ; then
        BILDQUALIT="${SOLLBILDQUALIT}"
fi
if [ -n "${SOLLTONQUALIT}" ] ; then
        TONQUALIT="${SOLLTONQUALIT}"
fi
if [ -z "${BILDQUALIT}" ] ; then
        BILDQUALIT="${PBILDQUALIT}"
fi
if [ -z "${TONQUALIT}" ] ; then
        TONQUALIT="${PTONQUALIT}"
fi
if [ -z "${BILDBREITE}" ] ; then
        BILDBREITE="${PBILDBREITE}"
fi
if [ -z "${BILDHOEHE}" ] ; then
        BILDHOEHE="${PBILDHOEHE}"
fi
if [ -z "${FPS}" ] ; then
        FPS="${PFPS}"
fi
#------------------------------------------------------------------------------#
# Tonqualität entsprechend dem Audio-Encoder setzen
case "${TONQUALIT}" in
        0)
                ABITR="64"
                AACQUALI="10"
                MP3QUALI="10"
                OGGQUALI="0"
                ;;
        1)
                ABITR="80"
                AACQUALI="35"
                MP3QUALI="9"
                OGGQUALI="1"
                ;;
        2)
                ABITR="96"
                AACQUALI="70"
                MP3QUALI="8"
                OGGQUALI="2"
                ;;
        3)
                ABITR="112"
                AACQUALI="100"
                MP3QUALI="7"
                OGGQUALI="3"
                ;;
        4)
                ABITR="128"
                AACQUALI="130"
                MP3QUALI="6"
                OGGQUALI="4"
                ;;
        5)
                ABITR="160"
                AACQUALI="160"
                MP3QUALI="5"
                OGGQUALI="5"
                ;;
        6)
                ABITR="192"
                AACQUALI="200"
                MP3QUALI="4"
                OGGQUALI="6"
                ;;
        7)
                ABITR="224"
                AACQUALI="240"
                MP3QUALI="3"
                OGGQUALI="7"
                ;;
        8)
                ABITR="256"
                AACQUALI="300"
                MP3QUALI="2"
                OGGQUALI="8"
                ;;
        9)
                ABITR="320"
                AACQUALI="400"
                MP3QUALI="1"
                OGGQUALI="9"
                ;;
        10)
                ABITR="448"
                AACQUALI="500"
                MP3QUALI="0"
                OGGQUALI="10"
                ;;
esac
#------------------------------------------------------------------------------#
# Bildqualität entsprechend dem Video-Encoder setzen
case "${BILDQUALIT}" in
        0)
                SOLLCRF="28"
                PIXELBIT="1"
                ;;
        1)
                SOLLCRF="27"
                PIXELBIT="2"
                ;;
        2)
                SOLLCRF="26"
                PIXELBIT="3"
                ;;
        3)
                SOLLCRF="25"
                PIXELBIT="4"
                ;;
        4)
                SOLLCRF="24"
                PIXELBIT="5"
                ;;
        5)
                SOLLCRF="23"
                PIXELBIT="6"
                ;;
        6)
                SOLLCRF="22"
                PIXELBIT="7"
                ;;
        7)
                SOLLCRF="21"
                PIXELBIT="8"
                ;;
        8)
                SOLLCRF="20"
                PIXELBIT="9"
                ;;
        9)
                SOLLCRF="19"
                PIXELBIT="10"
                ;;
        10)
                SOLLCRF="18"
                PIXELBIT="11"
                ;;
esac
#------------------------------------------------------------------------------#
### Tabelle der Aspect-Formate (steht so codiert im MPEG2-Container)
ASPTTAB="
1 1:1
2 4:3
3 16:9
4 2.21:1
"
#------------------------------------------------------------------------------#
### überprüfen ob alle benötigten Programme vorhanden sind
for BEFEHL in bash echo rev test tr rm mv tee fgrep egrep sed awk mplayer mencoder ${APROG} ${VPROG} ${ASTRETCH}
do
        if [ -z "$(which ${BEFEHL})" ] ; then
                echo "${BEFEHL} ist nicht installiert!"
                if [ "${BEFEHL}" == mkvmerge ] ; then
                        BEFEHL="mkvmerge aus den mkvtoolnix"
                fi
                if [ "${BEFEHL}" == oggenc ] ; then
                        BEFEHL="oggenc aus den vorbis-tools"
                fi
                if [ "${BEFEHL}" == soundstretch ] ; then
                        BEFEHL="soundstretch aus soundtouch"
                fi
                DAFEHLTWAS="${BEFEHL}"
                DASFEHLT="${DASFEHLT} ${BEFEHL}"
        else
                echo "${BEFEHL} gefunden..."
        fi
done
if [ -n "${DAFEHLTWAS}" ] ; then
        echo "
        DA FEHLT NOCH DAS:
        ${DASFEHLT}
        "
        exit 1
fi
if [ -z "$(x264 --fullhelp 2>/dev/null | fgrep nal-hrd)" ] ; then
        echo ""
        echo "Der installierte 'x264'-Encoder ist zu alt!"
        echo "Der 'x264'-Encoder-Code muss mindestens vom 2010-04-25 sein (r1480)."
        echo "Man kann es daran erkennen ob der 'x264'-Encoder den Parameter '--nal-hrd' versteht."
        exit 1
fi
if [ ! -r ${ORIGINAL} -o -z "${ORIGINAL}" ] ; then
        echo "
        HILFE:
        ${0} -h
        Es muss mindestens dieser Parameter gesetzt werden:
        ${0} -q film.mpg
        "
        exit 0
fi
################################################################################
NAME="$(basename "${ORIGINAL}" | rev | sed -e 's/ /_/g' -e 's/\./ /' -e 's/\./_/g' | rev | while read NAME ENDUNG
do
        basename "${NAME}"
done)"
TITELNAME="$(echo "${NAME}" | sed -e 's/_/ /g')"
#------------------------------------------------------------------------------#
### ID-Daten lesen
MOIDENTIFY="$(mplayer "${ORIGINAL}" -vo null -ao null -identify -frames 0 -nocache 2>&1)"
echo "${MOIDENTIFY}" | egrep '^ID_' | fgrep '=' | sed -e 's/=/="/' -e 's/.*/&"/' > /tmp/${NAME}_MOIDENTIFY
. /tmp/${NAME}_MOIDENTIFY
rm -f /tmp/${NAME}_MOIDENTIFY
if [ -z "${SOLLAUDIOID}" ] ; then
        ### es wird die erste oder die gewünschte Audiospur identifiziert
        ID_AUDIO_ID="$(echo "${MOIDENTIFY}" | fgrep 'ID_AUDIO_ID' | awk -F'=' '{print $NF}' | sort -n | uniq | head -n${TSN} | tail -n1)"
else
        ID_AUDIO_ID="${SOLLAUDIOID}"
fi
if [ -z "${ID_AUDIO_ID}" ] ; then
        ID_AUDIO_ID="128"
fi
#------------------------------------------------------------------------------#
#
# Bug-Fix
#
### Big Bug Bunny hat einen falschen Wert in der Variable für die Bildhöhe
if [ "${ID_VIDEO_HEIGHT}" == "1088" ] ; then
        ID_VIDEO_HEIGHT="1080"
fi
#------------------------------------------------------------------------------#
### Hier wird die Originalauflösung ermittelt
ORIBILDAUFLOESUNG="$(echo "${MOIDENTIFY}" | egrep '\(aspect [0-9]\)' | sed -e 's/(aspect .*//' -e 's/).*//' | egrep -v '^$' | awk '{print $NF}')"
if [ -z "${ORIBILDAUFLOESUNG}" ] ; then
        ORIBILDAUFLOESUNG="${ID_VIDEO_WIDTH}x${ID_VIDEO_HEIGHT}"
fi
BILDAUFLOESUNG="${ORIBILDAUFLOESUNG}"
#------------------------------------------------------------------------------#
### Mit Hilfe der CROP-Werte werden oben und unten die schwarzen Balken vom Breitwandfilm (16/9) abgeschnitten.
if [ -n "${CROP}" -a "${CROP}" != "0" ] ; then
        # mencoder -vf crop=704:432:08:72
        BILDAUSSCH="crop=${CROP},"
        BILDAUFLOESUNG="$(echo "${CROP}" | awk -F':' '{print $1"x"$2}')"
        CROPBILDBREITE="$(echo "${CROP}" | awk -F':' '{print $1}')"
        CROPBILDHOEHE="$(echo "${CROP}" | awk -F':' '{print $2}')"
        if [ -z "${BILDBREITE}" ] ; then
                BILDBREITE="${CROPBILDBREITE}"
        fi
        if [ -z "${BILDHOEHE}" ] ; then
                BILDHOEHE="${CROPBILDHOEHE}"
        fi
fi
if [ -z "${BILDBREITE}" ] ; then
        BILDBREITE="${ID_VIDEO_WIDTH}"
fi
if [ -z "${BILDHOEHE}" ] ; then
        BILDHOEHE="${ID_VIDEO_HEIGHT}"
fi
if [ "${BILDAUFLOESUNG}" == "${BILDBREITE}x${BILDHOEHE}" ] ; then
        BILDSKALIEREN="scale,"
else
        BILDAUFLOESUNG="${BILDBREITE}x${BILDHOEHE}"
        BILDSKALIEREN="scale=${BILDBREITE}:${BILDHOEHE},"
fi
#------------------------------------------------------------------------------#
# AVC-Makroblöcke berechnen
if [ "${CONTAINER}" == "mkv" ] ; then
        #----------------------------------------------------------------------#
        # Profile: http://wapedia.mobi/de/H.264#4.
        # Level: http://wapedia.mobi/de/H.264#5.
        ### da es "aufrunden" (ceiling) und "vergleichen" (in einem Schritt) in AWK nicht gibt
        ### muss ich statt dessen "runden+vergleichen" in zwei Schritten verwenden
        MBREITE="$(echo "${BILDBREITE}" | awk '{printf"%.0f\n",($1/16)}')"
        MBREITE="$(echo "${BILDBREITE} ${MBREITE}" | awk '{if (($1/16) > $2) $2 == $2+1 ; print $2}')"
        MHOEHE="$(echo "${BILDHOEHE}" | awk '{printf"%.0f\n",($1/16)}')"
        MHOEHE="$(echo "${BILDHOEHE} ${MHOEHE}" | awk '{if (($1/16) > $2) $2 == $2+1 ; print $2}')"
        MaxFS="$(echo "${MBREITE} ${MHOEHE}" | awk '{print $1 * $2}')"
        BHVERH="$(echo "${MBREITE} ${MHOEHE} ${MaxFS}" | awk -v verhaeltnis="gut" '{if ($1 > (sqrt($3 * 8))) verhaeltnis="schlecht" ; if ($2 > (sqrt($3 * 8))) verhaeltnis="schlecht" ; print verhaeltnis}')"
        if [ "${BHVERH}" == "gut" ] ; then
                echo "# Seitenverhältnis wird von AVC unterstützt."
        else
                echo "
                # Seitenverhältnis wird von AVC nicht unterstützt!
                ABBRUCH
                "
                exit 1
        fi
fi
ID_VIDEO_FPS="$(echo "${ID_VIDEO_FPS}" | awk '{print ($1)/1}')"
### wenn in den Metadaten des Filmes 1000 fps steht,
### dann sind es in wirklichkeit 15 fps
if [ "${ID_VIDEO_FPS}" == "1000" ] ; then
        ID_VIDEO_FPS="15"
elif [ "${ID_VIDEO_FPS}" == "50" ] ; then
        ID_VIDEO_FPS="25"
elif [ "${ID_VIDEO_FPS}" == "47.95" ] ; then
        ID_VIDEO_FPS="23.98"
fi
### gewünschte Bildwiederholrate festlegen/erzwingen,
### wenn sie als Parameter übergeben wurde
if [ -z "${FPS}" ] ; then
        FPS="${ID_VIDEO_FPS}"
fi
#------------------------------------------------------------------------------#
# Blu-ray-kompatible Parameter ermitteln
if [ "${CONTAINER}" == "mkv" ] ; then
        ### Bildwiederholrate ermitteln bzw. als Rechengrundlage festlegen
        BPS="$(if [ -z "${FPS}" ] ; then
            if [ -n "${ID_VIDEO_FPS}" ] ; then
                echo "${ID_VIDEO_FPS}" | awk '{print $1/1}'
            else
                # Wenn keine Bildwiederholrate aus den Metadaten des Filmes
                # ausgelesen werden konnte und keine Bildwiederholrate erzwungen
                # wurde, dann wird hier ein Wert festgesetzt um einen brauchbaren
                # AVC-LEVEL errechnen zu können.
                echo "25"
            fi
        else
                echo "${FPS}"
        fi)"
        BIAF420="$(echo "${BILDBREITE} ${BILDHOEHE}" | awk '{print $1 * $2 * 1.5}')"
        MLEVEL="$(echo "${MaxFS}" | awk '{if ($1 < 36865) LEVEL=51 ; if ($1 < 22081) LEVEL=50 ; if ($1 < 8193) LEVEL=42 ; if ($1 < 5121) LEVEL=32 ; if ($1 < 3601) LEVEL=31 ; if ($1 < 1621) LEVEL=30 ; if ($1 < 793) LEVEL=21 ; if ($1 < 397) LEVEL=20 ; if ($1 < 100) LEVEL=10 ; print LEVEL}')"
        PLEVEL="$(echo "${MBREITE} ${MHOEHE} ${BPS}" | awk '{print $1 * $2 * $3}' | awk '{if ($1 < 983041) LEVEL=51 ; if ($1 < 589825) LEVEL=50 ; if ($1 < 589825) LEVEL=42 ; if ($1 < 216001) LEVEL=32 ; if ($1 < 108001) LEVEL=31 ; if ($1 < 40501) LEVEL=30 ; if ($1 < 19801) LEVEL=21 ; if ($1 < 11881) LEVEL=20 ; if ($1 < 1486) LEVEL=10 ; print LEVEL}')"
        MLEVEL="$(echo "${MLEVEL} ${PLEVEL}" | awk '{if ($1 > $2) LEVEL=$1 ; if ($1 == $2) LEVEL=$1 ; if ($1 < $2) LEVEL=$2 ; print LEVEL}')"
        LEVEL="$(echo "${MLEVEL}" | sed 's/[0-9]$/.&/')"
        ### für 1000 bit/s !!!
        #   http://forum.doom9.org/showthread.php?t=101345
        if [ "${MLEVEL}" == "10" -a "${PROFILE}" == "high" ] ; then
              MaxBR="80"
              MaxCPB="175"
              MaxVmvR="-64,63.75"             # max. Vertical MV component range
              MinCR="2"
              CRF="25"
        elif [ "${MLEVEL}" == "20" -a "${PROFILE}" == "high" ] ; then
              MaxBR="2500"
              MaxCPB="2500"
              MaxVmvR="-128,127.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="24"
        elif [ "${MLEVEL}" == "21" -a "${PROFILE}" == "high" ] ; then
              MaxBR="5000"
              MaxCPB="5000"
              MaxVmvR="-256,255.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="24"
        elif [ "${MLEVEL}" == "30" -a "${PROFILE}" == "high" ] ; then
              MaxBR="12500"
              MaxCPB="12500"
              MaxVmvR="-256,255.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="23"
        elif [ "${MLEVEL}" == "31" -a "${PROFILE}" == "high" ] ; then
              MaxBR="17500"
              MaxCPB="17500"
              MaxVmvR="-512,511.75"           # max. Vertical MV component range
              MinCR="4"
              CRF="23"
        elif [ "${MLEVEL}" == "32" -a "${PROFILE}" == "high" ] ; then
              MaxBR="25000"
              MaxCPB="25000"
              MaxVmvR="-512,511.75"           # max. Vertical MV component range
              MinCR="4"
              CRF="23"
        elif [ "${MLEVEL}" == "42" -a "${PROFILE}" == "high" ] ; then
              MaxBR="62500"
              MaxCPB="62500"
              MaxVmvR="-512,511.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="22"
        elif [ "${MLEVEL}" == "50" -a "${PROFILE}" == "high" ] ; then
              MaxBR="168750"
              MaxCPB="168750"
              MaxVmvR="-512,511.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="21"
        elif [ "${MLEVEL}" == "51" -a "${PROFILE}" == "high" ] ; then
              MaxBR="300000"
              MaxCPB="300000"
              MaxVmvR="-512,511.75"           # max. Vertical MV component range
              MinCR="2"
              CRF="20"
        fi
        #----------------------------------------------------------------------#
        # Bildqualität wird nach Benutzerwunsch gesetzt
        if [ -n "${SOLLCRF}" ] ; then
                CRF="${SOLLCRF}"
        fi
        #----------------------------------------------------------------------#
        if [ "${MLEVEL}" == "41" ] ; then
                SLICES="4"
        else
                SLICES="1"
        fi
        if [ -z "${BILDHOEHE}" ] ; then
                BILDHOEHE="0"
        fi
        MREFF="--ref 6"
        if [ "${BILDHOEHE}" == "1080" ] ; then
                MREFF="--ref 4"
        elif [ "${BILDHOEHE}" -gt "480" -a "${MLEVEL}" -le "30" ] ; then
                MREFF="--ref 5"
        fi
        # if(pyramid)
        #     MaxDPB >= (bytes in a frame) * min(16, ref + 2)
        # else if(bframes)
        #     MaxDPB >= (bytes in a frame) * min(16, ref + 1)
        # else
        #     MaxDPB >= (bytes in a frame) * ref
        #----------------------------------------------------------------------#
        ### NTSC-, PAL- oder Blu-ray-Farbraum
        #if [ "${PAR}" == "ntsc" -o "${PAR}" == "NTSC" ] ; then
        #        # DVD (NTSC): 4/3 - 720x480
        #        FARBCOD="smpte170m"
        #elif [ "${PAR}" == "pal" -o "${PAR}" == "PAL" ] ; then
        #        # DVD (PAL): 4/3 - 720x576
        #        FARBCOD="bt470bg"
        #else
        #        # Standard ist Blu-ray mit quadratischen Pixeln
        #        FARBCOD="bt470"
        #fi
        # HDTV-Standard
        FARBCOD="bt709"
        #----------------------------------------------------------------------#
        # MPEG-4 Part 10 (AVC) / x264
        ### funktioniert erst mit dem x264 ab Version vom 2010-04-25 (Blu-ray - kompatibel)
        OPTIMIERUNGEN=" \
        --profile ${PROFILE} \
        --threads ${NUTZKERNE} \
        --b-adapt 2 \
        --direct auto \
        --slow-firstpass \
        --no-fast-pskip \
        --me tesa \
        --merange 24 \
        --partitions all \
        --rc-lookahead 60 ${MREFF} \
        --subme 10 \
        --trellis ${TRELLIS} \
        --nr \
        "
        BLURAY=" \
        --weightp 0 \
        --bframes 3 \
        --nal-hrd vbr \
        --vbv-maxrate ${MaxBR} \
        --vbv-bufsize ${MaxCPB} \
        --level ${LEVEL} \
        --keyint 24 \
        --min-keyint 2 \
        --b-pyramid strict \
        --slices ${SLICES} \
        --aud \
        --colorprim ${FARBCOD} \
        --transfer ${FARBCOD} \
        --colormatrix ${FARBCOD} \
        --sar \
        "
        ########################################################################
fi
#------------------------------------------------------------------------------#
if [ -z "${BILDHOEHE}" ] ; then
        BILDHOEHE="0"
fi
if [ -z "${SOLLNAME}" ] ; then
        NEUESFILMVERZ="$(dirname "${ORIGINAL}")"
        NEUERFILMNAME="${NAME}_-_${PPROFIL}_${BILDAUFLOESUNG}"
        if [ -n "${DEINTERLACER}" ] ; then
                NEUERFILMNAME="${NEUERFILMNAME}p${FPS}"
        fi
else
        NEUESFILMVERZ="$(dirname "${SOLLNAME}")"
        NEUERFILMNAME="$(basename "${SOLLNAME}")"
fi
if [ -e "${NEUERFILMNAME}.${CONTAINER}" ] ; then
        echo "
        ${NEUERFILMNAME}.${CONTAINER} existiert schon!
        "
        exit 1
fi
#------------------------------------------------------------------------------#
if [ -z "${PAR}" ] ; then
        # Standard ist Blu-ray mit quadratischen Pixeln
        VBREITE="${BILDBREITE}"
        BPAR="1"
else
        ### NTSC-, PAL- oder Blu-ray-Pixel
        if [ "${PAR}" == "ntsc" -o "${PAR}" == "NTSC" ] ; then
                # DVD (NTSC): 4/3 - 720x480 (640x480)
                VBREITE="$(echo "${BILDBREITE}" | awk '{print (($1*8)/9)}')"
                BPAR="8/9"
        elif [ "${PAR}" == "pal" -o "${PAR}" == "PAL" ] ; then
                # DVD (PAL): 4/3 - 720x576 (768x576)
                VBREITE="$(echo "${BILDBREITE}" | awk '{print (($1*16)/15)}')"
                BPAR="16/15"
        elif [ "${PAR}" == "dvb" -o "${PAR}" == "DVB" ] ; then
                # DVD (PAL): 16/9 - 720x576 (1024x576)
                VBREITE="$(echo "${BILDBREITE}" | awk '{print (($1*64)/45)}')"
                BPAR="64/45"
        else
                # Benutzerdefiniert
                SAR="${PAR}"
                if [ "$(echo "${PAR}" | egrep '[:/]')" ] ; then
                        FLIESSKPAR="$(echo "${PAR}" | sed 's#[:/]# #' | awk '{printf("%.16f\n",$1/$2)}')"
                else
                        FLIESSKPAR="${PAR}"
                fi
                VBREITE="$(echo "${BILDBREITE} ${FLIESSKPAR}" | awk '{print $1*$2}')"
                BPAR="${FLIESSKPAR}/1"
        fi
        BPAR="$(echo "${BPAR}" | sed 's#[:/]# #' | awk '{printf("%.16f\n",$1/$2)}')"
        FAKTOR="300000"
        Z="1"                   # Zähler
        until [ "${Z}" -eq "${FAKTOR}" ]
        do
                Z="$(echo "${Z}" | awk '{print $1+1}')"
                ERGEBNIS="$(echo "${VBREITE} ${BILDHOEHE} ${FAKTOR} ${Z}" | awk '{z=$4; for(i=$3;1<i;i--) print(($1*z)/i)"/"(($2*z)/i)}' | fgrep -v '.' | fgrep -v 'e-' | head -n1)"
                if [ -n "${ERGEBNIS}" ] ; then
                        Z="${FAKTOR}"
                        SOLLASPECT="${ERGEBNIS}"
                        echo "
                        PAR='${BPAR}'
                        neuer DAR='${SOLLASPECT}'
                        "
                fi
        done
fi
#------------------------------------------------------------------------------#
### automatische Aspect-Ermittlung,
### wenn nicht von Hand gesetzt
if [ -z "${SOLLASPECT}" ] ; then
        if [ -z "${CROP}" ] ; then
                ASPECT="$(
                ASPTNR="$(echo "${MOIDENTIFY}" | egrep '\(aspect [0-9]\)' | sed -e 's/.*(aspect //' -e 's/).*//')"
                if [ -n "${ASPTNR}" ] ; then
                        # steht der richtige Aspect in der Videodatei, dann verwende ihn
                        echo "${ASPTTAB}"|egrep "^${ASPTNR}"|awk '{print $2}'
                else
                        # steht der richtige Wert nicht drin, dann nimm diesen
                        IDVIDEOASPECT="$(echo "${ID_VIDEO_ASPECT}"|tr -d '.'|tr -d ',')"
                        if [ -n "${ID_VIDEO_ASPECT}" -a "${IDVIDEOASPECT}" -gt "0" ] ; then
                                # der ist zwar oft falsch aber besser als keiner
                                echo "${ID_VIDEO_ASPECT}"
                        fi
                fi | tr -s ':' '/')"
        else
                ASPECT="0"
        fi
else
        ASPECT="${SOLLASPECT}"
fi
### Konnte der ASPECT nicht aus dem Film ausgelesen werden,
### muss er errechnet werden
FAKTOR="300000"                         # max. Anzahl der Schleifendurchläufe sowie max. Anzahl der Schleifen für die SAR-Berechnung
if [ -z "${ASPECT}" -o "${ASPECT}" == "0" ] ; then
        echo "errechne ASPECT neu, das kann lange daueren ..."
        Z="1"                   # Zähler
        until [ "${Z}" -eq "${FAKTOR}" ]
        do
                Z="$(echo "${Z}" | awk '{print $1+1}')"
                ERGEBNIS="$(echo "${VBREITE} ${BILDHOEHE} ${FAKTOR} ${Z}" | awk '{z=$4; for(i=$3;1<i;i--) print(($1*z)/i)"/"(($2*z)/i)}' | fgrep -v '.' | fgrep -v 'e-' | head -n1)"
                if [ -n "${ERGEBNIS}" ] ; then
                        Z="${FAKTOR}"
                        ASPECT="${ERGEBNIS}"
                        echo "ASPECT='${ASPECT}'"
                fi
        done
elif [ "$(echo "${ASPECT}" | fgrep -v '/')" ] ; then
        echo "rechne ASPECT um, das kann lange daueren ..."
        Z="1"                   # Zähler
        until [ "${Z}" -eq "${FAKTOR}" ]
        do
                Z="$(echo "${Z}" | awk '{print $1+1}')"
                ERGEBNIS="$(echo "${ASPECT} ${FAKTOR} ${Z}" | awk '{z=$3; for(i=$2;1<i;i--) print(($1*z)/i)"/"((z)/i)}' | fgrep -v '.' | fgrep -v 'e-' | head -n1)"
                if [ -n "${ERGEBNIS}" ] ; then
                        Z="${FAKTOR}"
                        ASPECT="${ERGEBNIS}"
                        echo "ASPECT='${ASPECT}'"
                fi
        done
fi
if [ -z "${SAR}" -o "${SAR}" == "0" ] ; then
### hier wird das Seitenverhältnis der Bildpunkte (SAR) errechnet
echo "errechne SAR bzw. PAR, das kann lange daueren ..."
Z="1"                   # Zähler
until [ "${Z}" -eq "${FAKTOR}" ]
do
        Z="$(echo "${Z}" | awk '{print $1+1}')"
        ERGEBNIS="$(echo "${BILDBREITE} ${BILDHOEHE} ${ASPECT} ${FAKTOR} ${Z}" | sed 's#/# #' | awk '{for(i=$5;1<i;i--) {print (($2*$3*$6)/$4)/i":"($1*$6)/i}}' | fgrep -v '.' | head -n1)"
        if [ -n "${ERGEBNIS}" ] ; then
                # sowie ein Ergebnis ermittelt wurde, die Berechnung beenden
                Z="${FAKTOR}"
                SAR="${ERGEBNIS}"
                echo "SAR='${SAR}'"
        fi
done
fi
echo "überprüfe SAR ..."
### wenn kein SAR-Wert errechnet werden konnte, dann wir der Standard gesetzt
if [ "$(echo "${SAR}" | tr -s '[:/]' '\n' | sort | uniq | egrep '^0$')" ] ; then
        echo "errechneter SAR-Wert ist Unsinn, setze den Blu-ray-Standard:"
        SAR="1:1"
        echo "SAR='${SAR}'"
fi
if [ "$(echo "${SAR}" | fgrep '/')" ] ; then
        echo "falsches Trennzeichen, setze jetzt das richtige:"
        SAR="$(echo "${SAR}" | awk -F'/' '{print $1":"$2}')"
        echo "SAR='${SAR}'"
fi
if [ "$(echo "${SAR}" | tr -s '[/:]' '\n' | wc -l | awk '{print $1}')" == "1" ] ; then
        echo "SAR='${SAR}'"
        echo "SAR enthält ein falsches Trennzeichen, setze jetzt das richtige:"
        FAKTOR="300000"
        Z="1"
        until [ "${Z}" -eq "${FAKTOR}" ]
        do
                Z="$(echo "${Z}" | awk '{print $1+1}')"
                ERGEBNIS="$(echo "${SAR} ${Z}" | awk '{print ($1*$NF)}' | egrep -v '^0$' | fgrep -v '.' | head -n1)"
                if [ -n "${ERGEBNIS}" ] ; then
                        # sowie ein Ergebnis ermittelt wurde, die Berechnung beenden
                        SAR="${ERGEBNIS}:${Z}"
                        echo "SAR='${SAR}'"
                        Z="${FAKTOR}"
                fi
        done
fi
#------------------------------------------------------------------------------#
if [ -z "${ANPASSUNG}" ] ; then
        ANGEPASTEAUFLOESUNG="$(echo "${ORIBILDAUFLOESUNG}"|awk -F'x' -v hoehe=${BILDHOEHE} '{print $1"x"hoehe}')"
        NOMINALBBREITE="$(echo "${ANGEPASTEAUFLOESUNG} ${ASPECT}" | sed -e 's/x/ /' -e 's#/# #' | awk '{print (($2*$3)/$4)}')"
else
        NOMINALBBREITE="$(echo "${ORIBILDAUFLOESUNG} ${BPAR}" | sed -e 's/x/ /' -e 's#/# #' | awk '{print $1*$3}')"
        NOMINALBHOEHE="$(echo "${ORIBILDAUFLOESUNG} ${BPAR}" | sed -e 's/x/ /' -e 's#/# #' | awk '{print $2}')"
        FAKTOR="300000"
        Z="1"                   # Zähler
        until [ "${Z}" -eq "${FAKTOR}" ]
        do
                Z="$(echo "${Z}" | awk '{print $1+1}')"
                ERGEBNIS="$(echo "${NOMINALBBREITE} ${NOMINALBHOEHE} ${FAKTOR} ${Z}" | awk '{z=$4; for(i=$3;1<i;i--) print(($1*z)/i)"/"(($2*z)/i)}' | fgrep -v '.' | fgrep -v 'e-' | head -n1)"
                if [ -n "${ERGEBNIS}" ] ; then
                        Z="${FAKTOR}"
                        ASPECT="${ERGEBNIS}"
                        echo "
                        ASPECT='${ASPECT}'
                        "
                fi
        done
        NOMINALBBREITE="$(echo "${BILDAUFLOESUNG}" | sed -e 's/x/ /' -e 's#/# #' | awk '{print $1}')"
        NOMINALBHOEHE="$(echo "${NOMINALBBREITE} ${ASPECT}" | sed -e 's/x/ /' -e 's#/# #' | awk '{print ($1*$3)/$2}')"
fi
#==============================================================================#
if [ "${BILDHOEHE}" -gt "576" ] ; then
        MATERIAL="HD"
else
        MATERIAL="SD"
fi
#------------------------------------------------------------------------------#
# Manchmal soll der neue Film nicht die gleiche Bildanzahl pro Sekunde haben,
# wie der alte Film.
# Zum Beispiel ist das bei den "simple profile" für die MiniPlayer wichtig.
OFPS="-ofps ${FPS}/1"
#------------------------------------------------------------------------------#
echo "
VERSION='${VERSION}'
Quell-MATERIAL='${MATERIAL}'
SOLLASPECT='${SOLLASPECT}'
PPROFIL='${PPROFIL}'
AUDIOCODEC='${AUDIOCODEC}'
AACQUALI='${AACQUALI}'
MP3QUALI='${MP3QUALI}'
OGGQUALI='${OGGQUALI}'
CRF='${CRF}'
CROP='${CROP}'
DELAYTRANSTON='${DELAYTRANSTON}' ms
DELAYOTON='${DELAYOTON}'
DELAYVIDEO='${DELAYVIDEO}'
DEINTERLACER='${DEINTERLACER}'
FPS='${FPS}'
NUTZKERNE='${NUTZKERNE}'
AS='${AS}'
MKVSYNC='${MKVSYNC}'
PAR='${PAR}'
OTON='${OTON}'
ORIGINAL='${ORIGINAL}'
RAUSCH='${RAUSCH}'
BILDBREITE='${BILDBREITE}'
BILDHOEHE='${BILDHOEHE}'
TSN='${TSN}'
SOLLNAME='${SOLLNAME}'
NAME='${NAME}'
TITELNAME='${TITELNAME}'
NEUESFILMVERZ='${NEUESFILMVERZ}'
NEUERFILMNAME='${NEUERFILMNAME}'
ID_AUDIO_ID='${ID_AUDIO_ID}'
UNTERTI='${UNTERTI}'
BHVERH='${BHVERH}'
MBREITE='${MBREITE}'
MHOEHE='${MHOEHE}'
MaxFS='${MaxFS}'
BIAF420='${BIAF420}'
MaxBR='${MaxBR}'
MaxCPB='${MaxCPB}'
MLEVEL='${MLEVEL}'
LEVEL='${LEVEL}'
PARAMETER='${PARAMETER}'
Original BILDAUFLOESUNG='${ORIBILDAUFLOESUNG}'
gesetzte BILDAUFLOESUNG='${BILDAUFLOESUNG}'
NOMINALBBREITE='${NOMINALBBREITE}'
VBREITE='${VBREITE}'
BILDSKALIEREN='${BILDSKALIEREN}'
LEVEL='${LEVEL}'
ASPTNR='${ASPTNR}'
ID_VIDEO_ASPECT='${ID_VIDEO_ASPECT}'
ASPECT='${ASPECT}'
SAR='${SAR}' ('${NOMINALBBREITE}'/'${BILDHOEHE}'/'${ASPECT}')
FARBCOD='${FARBCOD}'
ID_VIDEO_CODEC='${ID_VIDEO_CODEC}'
ID_AUDIO_CODEC='${ID_AUDIO_CODEC}'
Breite/Höhe='${ID_VIDEO_WIDTH}/${ID_VIDEO_HEIGHT}'
ID_VIDEO_FPS='${ID_VIDEO_FPS}'
" | tee ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
#==============================================================================#
#------------------------------------------------------------------------------#
if [ "${CONTAINER}" == "mkv" ] ; then
        echo "#---- AVC ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        MKVASPECT="--aspect-ratio 1:${ASPECT}"
        ### hier werden die "x264"-Parameter zusammengesetzt
        X264OPTS="${OPTIMIERUNGEN} ${RAUSCH} ${BLURAY} ${SAR}"
        if [ -n "${DEINTERLACER}" ] ; then
                DEINTERLACER="pp=${DEINTERLACER},"
        fi
        ### mplayer -demuxer help
        # x264 --crf 16 --preset veryslow --tune film --weightp 0 --bframes 3 --nal-hrd vbr --vbv-maxrate 40000 --vbv-bufsize 30000 --level 4.1 --keyint 24 --b-pyramid strict --slices 4 --aud --colorprim "bt709" --transfer "bt709" --colormatrix "bt709" --sar 1:1 <input> -o <output>
        OVC="raw -really-quiet -noskip -fps ${FPS} -lavcopts threads=${NUTZKERNE} -lavdopts threads=${NUTZKERNE} -vfm ffmpeg -vf ${DEINTERLACER}${BILDAUSSCH}${BILDSKALIEREN}softskip,harddup,format=i420"
        #----------------------------------------------------------------------#
        # transcodieren der Video-Spur
        #
        # ffmpeg -r ${FPS} -i ${ORIGINAL} -v 0 -vcodec rawvideo -vsync 0 -an -r ${FPS} -pix_fmt yuv420p -f rawvideo - | x264 - --input-res ${BILDAUFLOESUNG} --fps ${FPS} --crf ${CRF} ${X264OPTS} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER}
        #
        echo "
        ### Videospur wird in das Zielformat transcodiert
        mencoder ${ORIGINAL} ${MENCODERASPECT} ${UNTERTI} -nosound -ovc ${OVC} -of rawvideo -rawvideo fps=${FPS} -o - | x264 - --input-res ${BILDAUFLOESUNG} --fps ${FPS} --crf ${CRF} ${X264OPTS} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER}
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        mencoder ${ORIGINAL} ${MENCODERASPECT} ${UNTERTI} -nosound -ovc ${OVC} -of rawvideo -rawvideo fps=${FPS} -o - | x264 - --input-res ${BILDAUFLOESUNG} --fps ${FPS} --crf ${CRF} ${X264OPTS} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER}
        if [ ! -r ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} -o "$?" != "0" ] ; then
                echo "
                #
                # Beim erstellen der neuen Videospur ist ein Fehler aufgetreten.
                # Abbruch!
                #
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                exit 1
        fi
        #----------------------------------------------------------------------#
        echo "
        ### Audiospur als WAVE exportieren
        mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
        if [ "$?" != "0" ] ; then
            if [ "${ID_AUDIO_ID}" == "1" ] ; then
                echo "
                #
                # Beim schreiben der Audiospur mit der ID = ${ID_AUDIO_ID} ist ein Fehler aufgetreten.
                #
                # Dieses Problem tritt bei AVI-Containern manchmal auf.
                # Dann kann man die Tonspur meistens mit ID_AUDIO_ID=0
                # auslesen.
                #
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                ID_AUDIO_ID="0"
                echo "
                ### Audiospur als WAVE exportieren
                mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
            elif [ "${ID_AUDIO_ID}" == "0" ] ; then
                echo "
                #
                # Beim schreiben der Audiospur mit der ID = ${ID_AUDIO_ID} ist ein Fehler aufgetreten.
                #
                # Dieses Problem tritt bei FLV-Containern manchmal auf.
                # Dann kann man die Tonspur meistens mit ID_AUDIO_ID=1
                # auslesen.
                #
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                ID_AUDIO_ID="1"
                echo "
                ### Audiospur als WAVE exportieren
                mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                mplayer -aid ${ID_AUDIO_ID} -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
            fi
        fi
        if [ ! -r ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ] ; then
                echo "
                #
                # Die Datei mit der Audiospur konnte nicht gefunden werden.
                # Ich probiere es ohne Angabe der ID_AUDIO_ID nocheinmal.
                #
                ### Audiospur als WAVE exportieren
                mplayer -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                mplayer -vo null -ao pcm:waveheader:file=${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${ORIGINAL}
        fi
        if [ ! -r ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ] ; then
                echo "
                #
                # Die Datei mit der Audiospur konnte nicht gefunden werden.
                # Abbruch!
                #
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                exit 1
        fi
        #----------------------------------------------------------------------#
        ### Laufzeit der Spuren ermitteln
        # eine Asynchronität wird ausgeglichen,
        # wenn die Audio- und Video-Spuren sich in der Länge um mehr als ${LDIFF}% unterscheiden
        VL="$(mplayer ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} -vo null -ao null -identify -frames 0 -nocache 2>/dev/null | fgrep ID_LENGTH | awk -F'=' -v delaytranston=${DELAYTRANSTON} -v delayvideo=${DELAYVIDEO} '{print $2-(delaytranston/1000)+(delayvideo/1000)}')"
        AL="$(mplayer ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav -vo null -ao null -identify -frames 0 -nocache 2>/dev/null | fgrep ID_LENGTH | awk -F'=' '{print $2/1}')"
        echo "
        Spurlängen: Video='${VL}' Audio='${AL}'
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        #----------------------------------------------------------------------#
        # automatische Längenanpassung
        if [ "${AS}" == "JA" ] ; then
                # nur, wenn man mit Audiomodifikation synchronisieren möchte
                DIFFP="$(echo "${VL} ${AL}" | awk '{print (($2*100)/$1)-100}' | sed 's/-//')"
                AUSGLEICHEN="$(echo "${DIFFP} ${LDIFF}" | awk '{AUSGLEICHEN="NEIN"; if ($1 > $2) AUSGLEICHEN="JA"; print AUSGLEICHEN}')"
                echo "
                ### automatische Längenanpassung aktiviert
                DIFFP='${DIFFP}' %
                AUSGLEICHEN='${AUSGLEICHEN}' durch soundstretch
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                ### wenn Audio- und Videospur unterschiedlich lang sind, wird das korrigiert
                if [ "${AUSGLEICHEN}" == "JA" -a "${VL}" != "0" -a "${AL}" != "0" ] ; then
                        echo "
                        # wenn Audio- und Videospur unterschiedlich lang sind, wird die Audiospur angepasst
                        mv ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav
                        soundstretch ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav -tempo=${DIFFP}
                        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                        mv ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav
                        soundstretch ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav -tempo=${DIFFP}
                fi
        fi
        #----------------------------------------------------------------------#
        ### Tonspur übersetzen
        if [ "${AUDIOCODEC}" == "aac" -o "${AUDIOCODEC}" == "AAC" ] ; then
                echo "
                ### Audiospur transcodieren
                faac --tns --title '${TITELNAME}' -q ${AACQUALI} -w -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.m4a ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.m4a ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                faac --tns --title "${TITELNAME}" -q ${AACQUALI} -w -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.m4a ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.m4a ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
        elif [ "${AUDIOCODEC}" == "mp3" -o "${AUDIOCODEC}" == "MP3" ] ; then
                echo "
                lame --tt '${TITELNAME}' -q 0 -V ${MP3QUALI} ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.mp3
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.mp3 ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                lame --tt "${TITELNAME}" -q 0 -V ${MP3QUALI} ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.mp3
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.mp3 ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
        elif [ "${AUDIOCODEC}" == "ogg" -o "${AUDIOCODEC}" == "OGG" ] ; then
                echo "
                oggenc -t '${TITELNAME}' -q ${OGGQUALI} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.ogg ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.ogg ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                oggenc -t "${TITELNAME}" -q ${OGGQUALI} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.ogg ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav
                mv -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.ogg ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur
        fi
        #----------------------------------------------------------------------#
        if [ "${MKVSYNC}" == "JA" ] ; then
                ### Laufzeit der Spuren ermitteln
                # eine Asynchronität wird ausgeglichen,
                # wenn die beiden Spuren sich in der Länge um mehr als ${LDIFF} unterscheiden
                AL="$(mplayer ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur -vo null -ao null -identify -frames 0 -nocache 2>/dev/null | fgrep ID_LENGTH | awk -F'=' '{print $2/1}')"
                DIFFP="$(echo "${VL} ${AL}" | awk '{print (($2*100)/$1)-100}' | sed 's/-//')"
                AUSGLEICHEN="$(echo "${DIFFP} ${LDIFF}" | awk '{AUSGLEICHEN="NEIN"; if ($1 > $2) AUSGLEICHEN="JA"; print AUSGLEICHEN}')"
                echo "
                ### automatische Längenanpassung durch MKV aktiviert
                ### Audiostartzeitpunkt um ${DELAYTRANSTON}ms verschieben
                Spurlängen: Video='${VL}' Audio='${AL}'
                DIFFP='${DIFFP}' %
                AUSGLEICHEN='${AUSGLEICHEN}' durch mkvmerge
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                ### wenn Audio- und Videospur unterschiedlich lang sind, wird das korrigiert
                if [ "${AUSGLEICHEN}" == "JA" -a "${VL}" != "0" -a "${AL}" != "0" ] ; then
                        YAS="-y 1:${DELAYTRANSTON},${VL}/${AL}"
                fi
        else
                echo "
                ### keine automatische Längenanpassung durch MKV
                ### Audiostartzeitpunkt um ${DELAYTRANSTON}ms verschieben
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                YAS="-y 1:${DELAYTRANSTON}"
        fi
        if [ -n "${DELAYVIDEO}" ] ; then
                echo "
                ### Videostartzeitpunkt um ${DELAYVIDEO}ms verschieben
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                YVS="-y 1:${DELAYVIDEO}"
        fi
        #----------------------------------------------------------------------#
        # wenn gewünscht,
        # dann auch die Originaltonspur mit übernehmen
        if [ "${OTON}" == "JA" ] ; then
                echo "
                ### Originaltonspur soll auch mit rein
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OTON="-D -y ${TSN}:${DELAYOTON} --compression ${TSN}:none ${ORIGINAL}"
        fi
        #----------------------------------------------------------------------#
        # Film zusammen bauen
        echo "
        mkvmerge --default-language ger ${MKVASPECT} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}.${CONTAINER} -A ${YVS} --compression 1:none ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} -D ${YAS} --compression 1:none ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur ${OTON}
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        mkvmerge --default-language ger ${MKVASPECT} -o ${NEUESFILMVERZ}/${NEUERFILMNAME}.${CONTAINER} -A ${YVS} --compression 1:none ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} -D ${YAS} --compression 1:none ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur ${OTON}
        #----------------------------------------------------------------------#
        ### aufräumen
        echo "
        rm -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} ${NEUESFILMVERZ}/${NEUERFILMNAME}_async.${CONTAINER}
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        rm -f ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur_original.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur.wav ${NEUESFILMVERZ}/${NEUERFILMNAME}_audiospur ${NEUESFILMVERZ}/${NEUERFILMNAME}_videospur.${CONTAINER} ${NEUESFILMVERZ}/${NEUERFILMNAME}_async.${CONTAINER}
        #----------------------------------------------------------------------#
elif [ "${CONTAINER}" == "avi" ] ; then
        echo "#---- kein AVC ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        MENCODERASPECT="-aspect ${ASPECT}"
        #----------------------------------------------------------------------#
        if [ -n "${DEINTERLACER}" ] ; then
                DEINTERLACER="${DEINTERLACER},"
        fi
        if [ -n "${RAUSCH}" ] ; then
                if [ -n "${DEINTERLACER}" ] ; then
                        RAUSCH="pp=tn:${RAUSCH}/"
                else
                        RAUSCH="pp=tn:${RAUSCH},"
                fi
        else
                if [ -n "${DEINTERLACER}" ] ; then
                        DEINTERLACER="pp=${DEINTERLACER}"
                fi
        fi
        #----------------------------------------------------------------------#
        if [ "${SW}" == "sw" ] ; then
                # für Schwarz/Weiss-Filme
                FARBE=":nochroma_opt:nochroma_me"
        else
                # für Farb-Filme
                FARBE=":chroma_me"
        fi
        #----------------------------------------------------------------------#
        VBITR="$(echo "${PIXELBIT} ${BILDAUFLOESUNG}" | tr -s 'x' ' ' | awk '{printf("%u\n",($1*$2*$3)/1000)}')"
        #----------------------------------------------------------------------#
        # Audio-Codec auswählen
        if [ "${OTON}" == "JA" ] ; then
                OAC="copy"
        elif [ "${AUDIOCODEC}" == "mp2" ] ; then
                OAC="lavc -lavcopts acodec=mp2:abitrate=${ABITR} -srate 44100"
        elif [ "${AUDIOCODEC}" == "mp3" ] ; then
                OAC="mp3lame -lameopts q=0:aq=0:br=${ABITR} -channels 2"
        elif [ "${AUDIOCODEC}" == "ac3" ] ; then
                OAC="lavc -lavcopts acodec=ac3:abitrate=${ABITR}"
        fi
        #----------------------------------------------------------------------#
        if [ "${PPROFIL}" == "xvid" -o "${PPROFIL}" == "asp" ] ; then
                echo "#---- Xvid ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OVC="xvid -xvidencopts me_quality=6:trellis:hq_ac:vhq=4:lumi_mask:threads=1:autoaspect:bitrate=${VBITR}${FARBE}"
                VF="${BILDAUSSCH}${BILDSKALIEREN}softskip,harddup ${OFPS}"
        elif [ "${PPROFIL}" == "divx" ] ; then
                echo "#---- DivX ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                if [ "${OTON}" == "JA" ] ; then
                        OAC="copy"
                fi
                OVC="lavc -lavcopts vcodec=mpeg4:autoaspect:trell=yes:mbd=2:v4mv=yes:qpel:vbitrate=${VBITR}"
                VF="${BILDAUSSCH}${BILDSKALIEREN}softskip,harddup ${OFPS}"
        elif [ "${PPROFIL}" == "test" ] ; then
                echo "#---- Test ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OVC="lavc -lavcopts vcodec=mpeg4:autoaspect:trell=no:mbd=0:vbitrate=${VBITR} -endpos 240"
                VF="${BILDAUSSCH}${BILDSKALIEREN}softskip,harddup -ffourcc DX50 ${OFPS}"
        elif [ "${PPROFIL}" == "dx50" ] ; then
                echo "#---- DivX 5 ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OVC="lavc -lavcopts vcodec=mpeg4:autoaspect:trell=yes:mbd=2:v4mv=yes:qpel:vbitrate=${VBITR}"
                VF="${BILDAUSSCH}${BILDSKALIEREN}softskip,harddup -ffourcc DX50 ${OFPS}"
        elif [ "${PPROFIL}" == "sp3dx" ] ; then
                echo "#---- DivX SPL3 ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                if [ "${FPS}" -gt "15" ] ; then
                        echo "
                        Das Simple-Profil Level 3 lässt nur maximal 15 Bilder pro Sekunde zu,
                        bitte verwende die Option: -fps 15
                        "
                        exit 1
                fi
                OVC="lavc -lavcopts vcodec=mpeg4:autoaspect:trell=yes:mbd=2:v4mv=yes:qpel:vbitrate=${VBITR}"
                VF="scale=${BILDBREITE}:-2,expand=:${BILDHOEHE}:::1,crop=${BILDBREITE}:${BILDHOEHE},softskip,harddup -ffourcc DX50 ${OFPS}"
        elif [ "${PPROFIL}" == "sp3xv" ] ; then
                echo "#---- Xvid SPL3 ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                if [ "${FPS}" -gt "15" ] ; then
                        echo "
                        Das Simple-Profil Level 3 lässt nur maximal 15 Bilder pro Sekunde zu,
                        bitte verwende die Option: -fps 15
                        "
                        exit 1
                fi
                OVC="xvid -xvidencopts profile=sp3:max_bframes=0:me_quality=6:trellis:chroma_opt:hq_ac:vhq=4:lumi_mask:threads=1:bitrate=${VBITR}"
                VF="scale=${BILDBREITE}:-2,expand=:${BILDHOEHE}:::1,crop=${BILDBREITE}:${BILDHOEHE},softskip,harddup ${OFPS}"
        elif [ "${PPROFIL}" == "em880" ] ; then
                echo "#---- entryx EM880RB ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                if [ "${FPS}" -gt "20" ] ; then
                        echo "
                        Der entryx EM880RB kann nur maximal 20 Bilder pro Sekunde darstellen,
                        bitte verwende die Option: -fps 20
                        "
                        exit 1
                fi
                if [ "${BILDBREITE}" -gt "320" -o "${BILDHOEHE}" -gt "240" ] ; then
                        echo "
                        Der entryx EM880RB kann nur ein Format von max. 320x240 Pixeln darstellen,
                        bitte verwende die Option: -s 320x240
                        "
                        exit 1
                fi
                OVC="xvid -xvidencopts max_bframes=0:me_quality=6:trellis:chroma_opt:hq_ac:vhq=4:lumi_mask:threads=1:bitrate=${VBITR}"
                VF="scale=${BILDBREITE}:-2,expand=:${BILDHOEHE}:::1,crop=${BILDBREITE}:${BILDHOEHE},softskip,harddup ${OFPS}"
        elif [ "${PPROFIL}" == "sp5dx" ] ; then
                echo "#---- DivX SPL5 ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OVC="lavc -lavcopts vcodec=mpeg4:threads=1:vbitrate=${VBITR}:autoaspect:mbd=2:v4mv:trell:cbp:mv0:mv0_threshold=0:qprd:umv:nr=0:lumi_mask=0.1:dark_mask=0.1:p_mask=0.1"
                VF="scale=${BILDBREITE}:-2,expand=:${BILDHOEHE}:::1,crop=${BILDBREITE}:${BILDHOEHE},softskip,harddup -ffourcc DX50"
        elif [ "${PPROFIL}" == "sp5xv" ] ; then
                echo "#---- Xvid SPL5 ----#" | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                OVC="xvid -xvidencopts profile=sp5:max_bframes=0:me_quality=6:trellis:chroma_opt:hq_ac:vhq=4:lumi_mask:threads=1:bitrate=${VBITR}"
                VF="scale=${BILDBREITE}:-2,expand=:${BILDHOEHE}:::1,crop=${BILDBREITE}:${BILDHOEHE},softskip,harddup"
        else
                echo "
                nicht unterstütztes Profil
                ABBRUCH
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                exit 1
        fi
        #----------------------------------------------------------------------#
        ### Alternative zu mencoder:
        # ffmpeg -i ${ORIGINAL} -v 0 -vcodec rawvideo -vsync 0 -an -pix_fmt yuv420p -f rawvideo - | 
        #
        # x264 ferlustfrei (ist sehr langsam, funktioniert aber prima)
        # mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -oac pcm -really-quiet -noskip -ovc x264 -x264encopts qp=0 -vf-pre ${RAUSCH}${DEINTERLACER}scale=${ZBB}:-2,expand=:${ZBH}:::1,crop=${ZBB}:${ZBH},softskip,harddup ${MENCODERASPECT} -of lavf -lavfopts format=matroska -o - | mencoder - -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${VF} -aspect 4/3 -demuxer lavf -lavfdopts format=matroska -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER}
        #
        # RAW ferlustfrei (ist sehr schnell, bringt aber leider kein Bild: Frame too small!)
        # mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -oac pcm -ovc raw -really-quiet -noskip -vf-pre ${RAUSCH}${DEINTERLACER}scale=${ZBB}:-2,expand=:${ZBH}:::1,crop=${ZBB}:${ZBH},softskip,harddup,format=i420 ${MENCODERASPECT} -of lavf -lavfopts format=matroska -o - | mencoder - -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${VF} -aspect 4/3 -demuxer lavf -lavfdopts format=matroska -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER}
        #
        KLAR=NEIN
        if [ "${NOMINALBBREITE}" -gt "${ZBB}" -o "${BILDHOEHE}" -gt "${ZBH}" ] ; then
                echo "
                mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -oac pcm -really-quiet -noskip -ovc x264 -x264encopts qp=${ZQP} -vf-pre ${RAUSCH}${DEINTERLACER}scale=${ZBB}:-2,expand=:${ZBH}:::1,crop=${ZBB}:${ZBH},softskip,harddup ${MENCODERASPECT} -of lavf -lavfopts format=matroska -o - | mencoder - -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${VF} -aspect 4/3 -demuxer lavf -lavfdopts format=matroska -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -oac pcm -really-quiet -noskip -ovc x264 -x264encopts qp=${ZQP} -vf-pre ${RAUSCH}${DEINTERLACER}scale=${ZBB}:-2,expand=:${ZBH}:::1,crop=${ZBB}:${ZBH},softskip,harddup ${MENCODERASPECT} -of lavf -lavfopts format=matroska -o - | mencoder - -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${VF} -aspect 4/3 -demuxer lavf -lavfdopts format=matroska -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER} && KLAR=JA
                if [ "$?" -gt "0" ] ; then
                NEUEPARAM="$(echo "${PARAMETER}" | sed "s/${ORIGINAL}/film_im_zwischenformat.mkv/g")"
                echo "
                Wird ein Film mit einer nominalen Breite von 1024 Pixeln direkt auf
                z.B. 320 Pixel Bildbreite runter skaliert, dann weist der neue
                kleine Film sehr viele Artefakte auf.
                Ein 16/9-Film im Format 720x576 hat eine nominale Bildbreite von
                1024 Bildpunkten.
                Um das zu verhindern, wurde hier versucht automatisch ein
                Zwischenfilm im RAW-Format zu erzeugen, dass scheint aber
                offensichtlich mit diesem Film nicht funktioniert zu haben.
                Deshalb schlage ich vor, in diesem Fall die langsamere und sicherere
                Methode zu versuchen.
                zum Beispiel könnte man diese beiden Kommandos ausprobieren,
                die Optionen sollten aber noch entsprechend angepasst werden:
                ${0} -q ${ORIGINAL} -z film_im_zwischenformat -s 720x432 ... (z.B.: -ts 2)
                ${0} ${NEUEPARAM}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                fi
        else
                echo "
                mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${RAUSCH}${DEINTERLACER}${VF} ${MENCODERASPECT} -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER}
                " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                mencoder ${ORIGINAL} ${UNTERTI} -aid ${ID_AUDIO_ID} -mc 0 -forceidx -of ${CONTAINER} -oac ${OAC} -ovc ${OVC} -vf-pre ${RAUSCH}${DEINTERLACER}${VF} ${MENCODERASPECT} -o ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER} && KLAR=JA
        fi
        if [ "${PPROFIL}" == "test" ] ; then
                ls -lh ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER}
        else
                if [ "${KLAR}" == "JA" ] ; then
                        mv -v ${NEUESFILMVERZ}/_${NEUERFILMNAME}.${CONTAINER} ${NEUESFILMVERZ}/${NEUERFILMNAME}.${CONTAINER} | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
                fi
        fi
else
        echo "
        nicht unterstützter Container
        ABBRUCH
        " | tee -a ${NEUESFILMVERZ}/${NEUERFILMNAME}.log
        exit 1
fi
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:GNU Free Documentation License 1.2
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki