ffmpeg batch neu codieren mit Unterordnern

Ich versuche, neu codieren ein paar hundert videos auf X265 aber es gibt viele Verzeichnisse, die Leerzeichen in den Dateinamen als tun einige der Dateien. Ich habe eine Reihe von Skripten und bin kämpfen, um zu finden, das funktioniert mit den Räumen und den verschiedenen Verzeichnisebenen.

Dieses funktioniert, solange es keine Unterverzeichnisse:

#!/bin/bash
for i in *.avi;
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Ich habe versucht, die Arbeit mit diesem bash-Skript, aber es funktioniert nicht mit den Leerzeichen bin ich raten.

#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
  video=`basename "$file"`
  dir=`dirname "$file"`
 ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)

In diesem thread sieht es aus wie eine gute Lösung für windows-Benutzer, aber nicht linux.
FFMPEG – Batch-Konvertierung von Unterordnern

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

Wenn Euch kann mir zu der richtigen Lösung, die geeignet ist für die bash, ich würde es zu schätzen wissen.

InformationsquelleAutor Alan | 2016-10-04



2 Replies
  1. 2

    Dies ist ein typisches Szenario für finden und xargs

    find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

    wo -print0 und -0 sicherstellen der korrekten Handhabung von Namen mit Leerzeichen.

    Und in convert.sh Sie haben Ihre for-Schleife, fast das gleiche wie in Ihrer ersten Skript

    #!/bin/bash
    
    for i; do
        d=$(dirname "$i")
        b=$(basename "$i")
        ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
    done

    for i ohne dass etwas dasselbe bedeutet wie „für alle Argumente“, mit denen man Dateien übergeben, die von xargs.

    Vorangestellt wird, der mit dem Namen mit einem string, müssen Sie die split-Namen in das Verzeichnis und Basis-Teil, und dann setzen Sie es wieder zusammen.

    • Danke Olaf, das sieht aus wie eine elegante Lösung, aber ich erhalte eine Fehlermeldung, wo es versucht voranstellen X265_, um die Verzeichnis-Namen, wenn es geht, um das erste Verzeichnis. Ich bekomme diese Fehlermeldung: X265_./Sub Directory/File with Spaces.avi: No such file or directory
    • Diese könnten nicht richtig funktionieren. Vielleicht braucht es einige hantieren mit Zitaten und Flucht, aber ich bin nicht an meinem computer jetzt, um es zu testen.
    • Danke @Olaf, Die änderungen, die Sie gemacht, klappte perfekt.
  2. 0

    Mit xargs + sh -c ist es auch möglich, mit bourne-Shell-Skript-Ersatz durch die übergabe der -I variable-in diesem Fall FILE–zu sh -c als positionelle parameter werden verwendet als $1 ausbau:

    find . -name '*.flac' -print0 | \
    xargs -0 -I FILE \
    sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE

    Hier, muss ich nur abhacken die .flac-Erweiterung mit ${1%.flac} hinzufügen und m4a.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.