Hallo zusammen,
mit Hilfe von grep habe ich die Ausgabe von ffprobe bereits so filtern können das nur eine Zeile ausgegeben wird die den Wert den ich brauche enthält:
Befehl:
1 | ffprobe -v 0 -select_streams s -show_entries stream=index:disposition=forced -of compact=nk=0 "$filename" | grep disposition:forced=1 |
Ausgabe:
1 | stream|index=3|disposition:forced=1 |
Davon brauche ich aber nur die Zahl (in diesem Fall die 3) aus index=3 um sie als Variable zu setzen. Ich habe mich schon etwas mit den Möglichkeiten von grep und awk beschäftigt aber beide scheinen nicht wirklich geeignet dafür zu sein. Oder ich habe was übersehen.
Ich wäre ziemlich dankbar für etwas Hilfe, denn ich stecke da grade fest. Ich habe gelesen das man mit pyton so was machen kann aber damit kenne ich mich überhaupt nicht aus.
Wen es interessiert was ich damit vor habe ... Ich arbeite grade an einem bash Script mit dem ich per Stapelverarbeitung alle Video Dateien in einem Verzeichnis mit ffmpeg umwandeln kann. Im ersten Schritt soll nur die deutsche Audiospur und wenn vorhanden die als "forced" markierte Untertitelspur und natürlich die Videospur selbst übertragen werden. In einem Zwischenschritt wird per cropdetect ermittelt wo das Video beschnitten werden kann, der Wert steht dann als Variable zur Verfügung. Der letzte Schritt konvertiert dann das "bereinigte" Video und beschneidet es mit dem wert von cropdetect.
Hier mal der Script wie er ungefähr geplahnt ist (aber eben noch nicht funktioniert):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #! /bin/bash # Einlesen der Eingabe von Quellkontainer und Zielkontainer sowie Quellordner und Zielordner # Sytax: ./[nameDerScriptdatei].sh [Quellkontainer] [Zielkontainer] [/Pfad/zum/Quellordner] [/Pfad/zum/Zielordner] # Beispiel: ./ffmpeg-batch.sh mp4 mkv /home/user/Videos /home/user/Videos/optimiert # Die Pfadangaben dürfen nicht mit einem / enden! srcExt=$1 #Quell Dateityp z.B. mp4 oder * für alle (Video) Dateien destExt=$2 #Ziel Dateityp z.B. mkv srcDir=$3 #Quellordner destDir=$4 #Zielordner # variable für das encodieren per Intel iGPU #arks="-hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128" # Übergabe von Optionen für ffmpeg opts="-c:v hevc -crf 18 -preset slow -ac 6 -c:a aac -b:a 128k" # Ermittelt die Dateinamen aus dem Quellordner, fügt ihn mit der Angabe des Quellordners zusammen und macht daraus die Variable filename. for filename in "$srcDir"/*.$srcExt; do basePath=${filename%.*} baseName=${basePath##*/} # Erstellt einen temporären Arbeidsordner tmp im Zielordner mkdir "$destDir"/tmp # Variable für den temporären Arbeitsordner tmpDir=$("$destDir"/tmp) # ermittelt die Dimensionen des tatsächlichen Videos bei Position 240 Sekunden (4 Minuten) um die schwarzen Balken entfernen zu können. Die 240 Sekunden stellen sicher das ein langer Vorspann nicht die Werte verfälscht. cropvalue=$(ffmpeg -i "$filename" -t 240 -vf cropdetect -f null - 2>&1 | awk '/crop/ { print $NF }' | tail -1) # Ermittelt die Untertitelspur die als forced markiert ist. subIndex=$(ffprobe -v 0 -select_streams s -show_entries stream=index:disposition=forced -of compact=nk=0 "$filename" | grep disposition:forced=1) #funktioniert so noch nicht # Konvertiert und beschneidet das Video in das angegebene Zielordner und den angegeben Zielkontainer und übernimmt nur die deutsche Tonspur und die als forced markierte Untertitelspur. ffmpeg -y -i "$tmpDir"/"$baseName" -map 0:v -map 0:a:m:language:ger -map 0:$subIndex -vf "$cropvalue" $opts "$destDir"/"$baseName"."$destExt" # löscht den erstellten temporären Arbeitsordner rm -f "$destDir"/tmp done |
Wahrscheinlich muss ich auch noch eine Schleife bauen für den Fall das es keine Untertitelspur gibt die als forced markiert ist.
Ich bedanke mich schon mal im vorraus bei jedem der mit Tipps oder sogar eine Lösung gibt.
Gruß