2016-10-04 5 views
2

Ich versuche, ein paar hundert Videos zu X265 reencode, aber es gibt viele Verzeichnisse, die Leerzeichen in den Dateinamen haben, wie einige der Dateien. Ich habe mir eine Reihe von Skripten angeschaut und kämpfe um eine, die mit den Leerzeichen und den verschiedenen Verzeichnisebenen arbeitet.ffmpeg Batch Reencode mit Unterordnern

Dieser funktioniert, solange es keine Unterverzeichnisse ist:

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

Ich habe versucht, mit diesem Bash-Skript zu arbeiten, aber es funktioniert nicht mit der Whitespaces ich raten bin.

#!/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) 

Auf diesem Thread es für Windows-Anwender wie eine gute Lösung aussieht, aber nicht linux. FFMPEG - Batch convert subfolders

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 Sie mir die richtige Lösung zeigen kann, die für bash geeignet ist, würde ich es zu schätzen wissen.

Antwort

2

Dies ist ein typisches Szenario für find und xargs

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

wo -print0 und -0 den richtigen Umgang mit Namen mit Leerzeichen gewährleisten.

Und in convert.sh, haben Sie Ihre for-Schleife, fast die gleiche wie in Ihrem 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 etwas bedeutet das gleiche wie „für alle Argumente gegeben“, das sind die übergebenen Dateien von xargs.

Um den Dateinamen mit einer Zeichenfolge voranzuzählen, müssen Sie den Namen in das Verzeichnis und Basisteil aufteilen und dann wieder zusammensetzen.

+0

Dank Olaf, sieht dies wie eine elegante Lösung aus, aber ich bekomme einen Fehler, wo es versucht, den X265_ dem Verzeichnisnamen voran zu stellen, wenn es zum ersten Verzeichnis geht. Ich erhalte diesen Fehler: 'X265_./Sub Directory/Datei mit Spaces.avi: Keine solche Datei oder dieses Verzeichnis' – Alan

+0

@Alan Dies funktioniert möglicherweise nicht richtig. Vielleicht braucht es etwas Zitaten und Fliehen, aber ich bin jetzt nicht am Computer, um es zu testen. –

+0

Danke @Olaf, Die Änderungen, die du gemacht hast, sind perfekt ausgearbeitet. – Alan

Verwandte Themen