Hallo, ich bräuchte mal Hilfe bei ffmpeg. Ich bin dabei einen Script zu schreiben der es ermöglicht alle Videos in einem Verzeichnis nacheinander umzuwandeln. Soweit funktioniert das auch.
Ich möchte aber das nur die Streams im fertigen Video sind die ich auch tatsächlich brauche. Ich schaffe es das nur die deutschen Audio und Untertitel Spuren auswählt werden. Der Einfachheit halber wäre es mir auch egal wenn alle (deutschen) Untertitel Spuren übernommen werden würden. Im Primziep bräuchte ich nur die Untertitel die übersetzen wenn trotz deutscher Tonspur eine andere Sprache gesprochen wird.
Das Problem ist aber das in einigen Quellen Untertitel Spuren vorhanden sind, die von FFMPEG nicht so einfach verarbeitet werden können weil nur Text zu Text oder Bitmap zu Bitmap möglich ist.
Ich habe schon etwas danach gesucht und bin teilweise auch fündig geworden. So ganz steige ich da aber trotzdem nicht durch.
Wie bringe ich ffmpeg dazu das es nur die Untertitel auswählt die "kompatibel" sind. Oder besser noch, kann ich ffmpeg dazu bringen das es nur die Untertitel auswählt die für Übersetzungen gemacht wurden? Ich tippe mal darauf das dies die "forced" Untertitel sind.
Wäre super wenn mir da jemand helfen könnte.
Im Notfall kann ich die Untertitel auch ganz weg lassen wenn es zu komplex für eine Stapelverarbeitung ist.
Hier mal der ganze Script damit ihr wisst was ich vor habe: ("-map 0:s:m:language:ger" ist für mein Vorhaben leider zu ungenau)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #! /bin/bash srcExt=$1 #Quell Dateityp z.B. mp4 oder * destExt=$2 #Ziel Dateityp z.B. mkv srcDir=$3 #Quellverzeichniss (darf nicht mit / enden) destDir=$4 #Zielverzeichniss (darf nicht mit / enden) #arks="-hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128" opts="-c:v hevc -crf 23 -map 0:v -map 0:a:m:language:ger -map 0:s:m:language:ger -ac 6 -c:a aac -b:a 128k" #Optionen für ffmpeg for filename in "$srcDir"/*.$srcExt; do basePath=${filename%.*} baseName=${basePath##*/} cropvalue=$(ffmpeg -i "$filename" -t 2400 -vf cropdetect -f null - 2>&1 | awk '/crop/ { print $NF }' | tail -1) ffmpeg -y -i $filename -vf "$cropvalue" $opts "$destDir"/"$baseName"."$destExt" done |
Ich sage schon mal Danke im voraus für jede Hilfe.
Gruß
PS: Der größte teil des Scrips ist nicht auf meinem Mist gewachsen 😉 Ich habe ihn nur ergänzt und an meine Bedürfnisse angepasst.