Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
synapsenstau
Beiträge: 172
Registriert: 08.10.2013 09:56:34
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Südharz

Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von synapsenstau » 25.12.2024 12:08:48

Moin,

Da mein neuer Samsung TV keine Avi's mehr kann wollte ich "mal schnell" ein avi-in-mkv Script schreiben. Leider mache ich Scripting zu selten...
Nur falls es wichtig ist, die avi's liegen auf meinen NAS, dort sollen die mkv's auch hin. NFS Share ist gemountet und funktioniert

Code: Alles auswählen

#!/bin/bash
DIR=/media/nas/video/test
HWINPUT='-hwaccel cuvid -hwaccel_output_format cuda'
HWOUTPUT='-map 0 -c:s copy -c:a aac -c:v hevc_nvenc -b_ref_mode 0'
FILES=$(find "${DIR}" -iname '*.avi')

for FILE in "$FILES"; do
    FILENAME=$(basename "${FILE}" | sed 's/avi/mkv/')
    ffmpeg -hide_banner $HWINPUT -i $FILE $HWOUTPUT "${DIR}/${FILENAME}" ;
done
Die HW-INPUT/OUTPUT Angaben habe ich stand alone getestet und funktionieren.

Irgendwo hab ich da einen denkfehler, weil er will nicht sauber über $FILES iteritieren und sed ändert nur die letzte gefundene Datei.
..::: Intel® Core™ i5-6600 :::..::: 16 GB Ram :::..
..::: 1 TB Nvme :::..::: 1 TB SSD :::..::: NVIDIA GeForce GTX 1070 :::.

tobo
Beiträge: 2540
Registriert: 10.12.2008 10:51:41

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von tobo » 25.12.2024 13:04:13

synapsenstau hat geschrieben: ↑ zum Beitrag ↑
25.12.2024 12:08:48

Code: Alles auswählen

#!/bin/bash
DIR=/media/nas/video/test
HWINPUT='-hwaccel cuvid -hwaccel_output_format cuda'
HWOUTPUT='-map 0 -c:s copy -c:a aac -c:v hevc_nvenc -b_ref_mode 0'
FILES=$(find "${DIR}" -iname '*.avi')

for FILE in "$FILES"; do
    FILENAME=$(basename "${FILE}" | sed 's/avi/mkv/')
    ffmpeg -hide_banner $HWINPUT -i $FILE $HWOUTPUT "${DIR}/${FILENAME}" ;
done
Die HW-INPUT/OUTPUT Angaben habe ich stand alone getestet und funktionieren.

Irgendwo hab ich da einen denkfehler, weil er will nicht sauber über $FILES iteritieren und sed ändert nur die letzte gefundene Datei.
Haben die Dateinamen keine Sonderzeichen, dann könntest du $FILES ohne Quoting benutzen, was aber nicht anzuraten ist. Mach deshalb die Schleife besser so:

Code: Alles auswählen

while read -r FILE; do
    FILENAME=$(basename "${FILE}" | sed 's/avi/mkv/')
    ffmpeg -hide_banner "$HWINPUT" -i "$FILE" "$HWOUTPUT" "${DIR}/${FILENAME}" ;
done <<<"$FILES"
EDIT: Das Quoting von insbesondere "$FILE" ergänzt.

Benutzeravatar
Meillo
Moderator
Beiträge: 9338
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von Meillo » 25.12.2024 23:17:54

synapsenstau hat geschrieben: ↑ zum Beitrag ↑
25.12.2024 12:08:48
Irgendwo hab ich da einen denkfehler, weil er will nicht sauber über $FILES iteritieren und sed ändert nur die letzte gefundene Datei.
So Probleme kannst du dadurch debuggen, indem du dir die Variableninhalte im Script zwischendurch mal ausgibst (`echo $FILE' u.ae.), oder vor Befehle (die keine Dateiumleitungen enthalten) ein `echo' setzt, um zu sehen, was ausgefuehrt worden waere, oder indem du `set -x' verwendest. Dann haettest du schnell gesehen, dass die erste Iteration bereits alle Dateien enthaelt.

tobo hat ja schon eine Loesung geliefert.

In dem Fall koennte man sich zudem das komplette Aufsammeln aller Dateinamen in der Variable sparen und sie stattdessen on-the-fly abarbeiten, mit:

Code: Alles auswählen

find ... | while read ...
Allerdings hat das Script noch ein paar mehr Probleme: Es funktioniert nicht bei verschachtelten Dateibaeumen, und falls alle Dateien direkt in dem Verzeichnis liegen sollten, ist `find' unnoetig. Desweiteren wird das Script Probleme haben, falls eine Datei z.B. ``Koalavideo.avi'' heissen wuerde.

Fuer deine einmalige Nutzung muss es nicht perfekt sein, mit wenig Aufwand kann man es aber deutlich robuster machen. Wir koennen dir dabei gerne helfen.
Use ed once in a while!

tobo
Beiträge: 2540
Registriert: 10.12.2008 10:51:41

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von tobo » 26.12.2024 05:50:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
25.12.2024 23:17:54
Allerdings hat das Script noch ein paar mehr Probleme: Es funktioniert nicht bei verschachtelten Dateibaeumen [...]
Weil - welches Problem siehst du da?

MaGe
Beiträge: 1829
Registriert: 01.06.2014 17:12:16

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von MaGe » 26.12.2024 11:02:11

synapsenstau hat geschrieben: Da mein neuer Samsung TV keine Avi's mehr kann wollte ich "mal schnell" ein avi-in-mkv Script schreiben. [...]

Frage: Du konvertierst die AVI neu (-c:v hevc_nvenc) in MKV
Hast du schon versucht nur den Datei-Header im Koffer (Containerformat AVI)
in MKV ändern, ohne zu kodieren,




gruss MaGe
Wir müssen uns vor der Klimaerwärmung nicht fürchten.
Uns rottet die soziale Kälte viel früher aus.

Benutzeravatar
Meillo
Moderator
Beiträge: 9338
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von Meillo » 26.12.2024 11:12:33

synapsenstau hat geschrieben: ↑ zum Beitrag ↑
25.12.2024 12:08:48

Code: Alles auswählen

#!/bin/bash
DIR=/media/nas/video/test
HWINPUT='-hwaccel cuvid -hwaccel_output_format cuda'
HWOUTPUT='-map 0 -c:s copy -c:a aac -c:v hevc_nvenc -b_ref_mode 0'
FILES=$(find "${DIR}" -iname '*.avi')

for FILE in "$FILES"; do
    FILENAME=$(basename "${FILE}" | sed 's/avi/mkv/')
    ffmpeg -hide_banner $HWINPUT -i $FILE $HWOUTPUT "${DIR}/${FILENAME}" ;
done
tobo hat geschrieben: ↑ zum Beitrag ↑
26.12.2024 05:50:37
Meillo hat geschrieben: ↑ zum Beitrag ↑
25.12.2024 23:17:54
Allerdings hat das Script noch ein paar mehr Probleme: Es funktioniert nicht bei verschachtelten Dateibaeumen [...]
Weil - welches Problem siehst du da?
Das was ich eigentlich gesehen habe, ist nicht so wie ich dachte, da habe ich mich gestern Abend verguckt. War wohl schon etwas zu spaet. ;-) Es funktioniert schon mit verschachtelten Dateibaeumen.

Irritiert hat mich folgendes Szenario:
- DIR ist /foo
- find findet /foo/bar/baz/quux.avi
- FILENAME ist dann quux.mkv
- ffmpeg schreibt nach /foo/quux.mkv und nicht dorthin wo die urspruengliche Datei liegt oder in ein separates Output-Verzeichnis. ... Das kann aber so beabsichtigt sein.
Use ed once in a while!

LarsLovstrom
Beiträge: 2
Registriert: 14.04.2025 09:52:44

Re: Find-Ffmpeg Konvertierungsscript will nicht wie ich will

Beitrag von LarsLovstrom » 14.04.2025 10:18:19

Dein Script hat ein Problem mit der for-Schleife und find. $FILES wird als ein String behandelt, nicht als Liste. Außerdem stimmt die sed-Logik nicht ganz. Hier eine korrigierte Version:
#!/bin/bash
DIR=/media/nas/video/test
HWINPUT='-hwaccel cuvid -hwaccel_output_format cuda'
HWOUTPUT='-map 0 -c:s copy -c:a aac -c:v hevc_nvenc -b_ref_mode 0'

find "${DIR}" -iname '*.avi' -print0 | while IFS= read -r -d '' FILE; do
FILENAME=$(basename "${FILE}" .avi).mkv
ffmpeg -hide_banner $HWINPUT -i "$FILE" $HWOUTPUT "${DIR}/${FILENAME}"
done

Änderungen:

find ... -print0 und read -r -d '' sorgen dafür, dass Dateinamen mit Leerzeichen korrekt verarbeitet werden.
basename "${FILE}" .avi entfernt direkt die .avi-Endung, dann hängen wir .mkv an.
Anführungszeichen bei $FILE für Robustheit.
Teste das mal, sollte jetzt sauber iterieren und konvertieren.

Antworten