Antworten:
Bei der vorherigen Antwort wird nur eine Ausgabedatei mit dem Namen out.mov erstellt. Versuchen Sie dies, um für jeden alten Film eine separate Ausgabedatei zu erstellen.
for i in *.avi;
do name=`echo "$i" | cut -d'.' -f1`
echo "$name"
ffmpeg -i "$i" "${name}.mov"
done
i was unexpected at this time.
do name=`echo "${i%.*}"`;
arbeitet mit Dateinamen mit Punkten (und Leerzeichen).
.bat
in Windows?
Unter Linux und MacOS kann dies in einer Zeile erfolgen, indem die Dateinamenerweiterung der Ausgabedatei mithilfe der Parametererweiterung geändert wird:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
ffmpeg
keine Eingabe und Ausgabe in dieselbe Datei möglich ist. 2) Ich bin nicht sicher, ob Bash-Befehle unter Windows 10 nativ funktionieren. Vielleicht sollte ich der Antwort hinzufügen, dass sie sich an Systeme richtet, die Bash nativ verwenden können, wie Linux und MacOS. lxs gab eine Windows-Antwort auf diese Frage.
for f in *.mkv; do ffmpeg -i "$f" -map 0 -movflags faststart -c:v libx264 -c:a copy -c:s copy "${f/x265/x264}"; done
Und unter Windows:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
FOR /F "tokens=*" %G IN ('dir /b *.mp3') DO ffmpeg -i "%G" -map_metadata -1 -c:v copy -c:a copy "%~nG .mp3"
Ein einzeiliges Bash-Skript wäre einfach zu erstellen - durch *.avi
Ihren Dateityp ersetzen :
for i in *.avi; do ffmpeg -i "$i" -qscale 0 "$(basename "$i" .avi)".mov ; done
-qscale
. Entfernen Sie es und verwenden Sie die Standardeinstellungen oder verwenden Sie -crf
stattdessen (Standard ist -crf 23
).
basename
schlägt der Befehl fehl, da die Backshick- Unterschale nicht in Anführungszeichen gesetzt wird. Genau aus diesem Grund hat bash stattdessen eine Shell-Erweiterung: für i in * .avi; do ffmpeg -i "$ i" -qscale 0 "$ (Basisname" $ i ".avi)". mov; fertig
Verwenden Sie zum Konvertieren mit Unterverzeichnissen z
find . -exec ffmpeg -i {} {}.mp3 \;
find -name "*.vtt" -exec ffmpeg -i {} {}.srt \;
find *.mp4 -exec ffmpeg -i {} {}.mp3 \;
find . -name *.ogg -or -name *.wma -exec ffmpeg -i {} {}.mp3 \;
find . -name *.wma -exec ffmpeg -i {} {}.mp3 \; -exec rm {} \;
Für Windows:
Hier konvertiere ich alle (.mp4) Dateien in (.mp3) Dateien.
Öffnen Sie einfach cmd, gehen Sie zum gewünschten Ordner und geben Sie den Befehl ein.
Verknüpfung: (optional)
1. Wechseln Sie zu dem Ordner, in dem sich Ihre (.mp4) -Dateien befinden.
2. Drücken Sie die Umschalttaste und klicken Sie mit der linken Maustaste und wählen Sie "PowerShell-Fenster hier
öffnen " oder "Eingabeaufforderungsfenster hier öffnen".
3. Geben Sie "cmd" ein [HINWEIS : Überspringen Sie diesen Schritt, wenn cmd anstelle von PowerShell direkt geöffnet wird.]
4. Führen Sie den Befehl aus
for %i in (*.mp4) do ffmpeg -i "%i" "%~ni.mp3"
Wenn Sie dies unter Windows 10 in eine Batchdatei einfügen möchten, müssen Sie %% i verwenden.
Für alle, die etwas mit ffmpeg stapelweise konvertieren möchten, aber eine praktische Windows-Oberfläche wünschen, habe ich dieses Front-End entwickelt:
https://sourceforge.net/projects/ffmpeg-batch
Es fügt ffmpeg eine Fenstermode-Oberfläche, Fortschrittsbalken und verbleibende Informationen hinzu, Funktionen, die ich bei der Verwendung von ffmpeg immer vermisst habe.
Wenn Sie GNU parallel haben, können Sie alle .avi-Dateien unten vid_dir
parallel in mp4 konvertieren , wobei Sie alle außer einem Ihrer CPU-Kerne mit verwenden
find vid_dir -type f -name '*.avi' -not -empty -print0 |
parallel -0 -j -1 ffmpeg -loglevel fatal -i {} {.}.mp4
Um von / in verschiedene Formate zu konvertieren, ändern Sie '*.avi'
oder .mp4
nach Bedarf. GNU parallel ist in den Repositorys der meisten Linux-Distributionen in einem Paket aufgeführt, das normalerweise aufgerufen wird parallel
.
!
am Ende eines der Bash-Einzeiler hinzufügen ?
Ich weiß, dass dies möglicherweise redundant ist, aber ich verwende dieses Skript, um Dateien stapelweise zu konvertieren.
old_extension=$1
new_extension=$2
for i in *."$old_extension";
do ffmpeg -i "$i" "${i%.*}.$new_extension";
done
Es sind zwei Argumente erforderlich, um es flexibler zu machen:
Ich erstelle einen Alias dafür, aber Sie können ihn auch manuell wie folgt verwenden:
sh batch_convert.sh mkv mp4
Dies würde alle mkv
Dateien in mp4
Dateien konvertieren .
Wie Sie sehen können, ist es etwas vielseitiger. Solange ffmpeg
es konvertiert werden kann, können Sie zwei beliebige Erweiterungen angeben.
Hier ein bisschen wie Code Golf, aber da fast alle Antworten bisher Bash sind (abgesehen von einem einsamen cmd), ist hier ein plattformübergreifender Windows - Befehl, der Powershell verwendet (weil fantastisch):
ls *.avi|%{ ffmpeg -i $_ <ffmpeg options here> $_.name.replace($_.extension, ".mp4")}
Sie können * .avi so ändern, dass es zu Ihrem Quellmaterial passt.
Fenster:
@echo off
for /r %%d in (*.wav) do (
ffmpeg -i "%%~nd%%~xd" -codec:a libmp3lame -c:v copy -qscale:a 2 "%
%~nd.2.mp3"
)
Dies ist eine variable Bitrate der Qualität 2, Sie können sie auf 0 setzen, wenn Sie möchten, aber wenn Sie kein wirklich gutes Lautsprechersystem haben, ist es imo wertlos
Natürlich ist jetzt PowerShell hinzugekommen, das speziell dafür entwickelt wurde, so etwas extrem einfach zu machen.
Und ja, PowerShell ist auch auf anderen Betriebssystemen als nur Windows verfügbar , ist jedoch unter Windows vorinstalliert, sodass dies für alle nützlich sein sollte.
Zunächst möchten Sie alle Dateien im aktuellen Verzeichnis auflisten. Beginnen wir also mit:
ls
Sie können auch verwenden, ls -Recurse
wenn Sie alle Dateien in Unterverzeichnissen rekursiv konvertieren möchten.
Dann filtern wir diese nur nach dem Dateityp, den wir konvertieren möchten - z. B. "avi".
ls | Where { $_.Extension -eq ".avi" }
Danach geben wir diese Informationen über a an FFmpeg weiter ForEach
.
Für die Eingabe von FFmpeg verwenden wir das FullName
- das ist der gesamte Pfad zur Datei. Und für die Ausgabe von FFmpeg werden wir das verwenden Name
- aber das am Ende durch ersetzen . Es wird also ungefähr so aussehen:.avi
.mp3
$_.Name.Replace(".avi", ".mp3")
Lassen Sie uns das alles zusammenfassen und das ist das Ergebnis:
ls | Where { $_.Extension -eq ".avi" } | ForEach { ffmpeg -i $_.FullName $_.Name.Replace(".avi", ".mp3") }
Dadurch werden alle ".avi" -Dateien über FFmpeg in ".mp3" -Dateien konvertiert. Ersetzen Sie einfach die drei Punkte in Anführungszeichen, um zu entscheiden, welche Art von Konvertierung Sie möchten, und fügen Sie FFmpeg innerhalb von Dateien weitere Argumente hinzu ForEach
.
Sie können noch einen Schritt weiter gehen und Remove-Item
am Ende hinzufügen , um die alten Dateien automatisch zu löschen.
Wenn ffmpeg
es sich nicht in Ihrem Pfad befindet und sich tatsächlich in dem Verzeichnis befindet, in dem Sie sich gerade befinden, schreiben Sie ./ffmpeg
dort statt nur ffmpeg
.
Hoffe das hilft jedem.
.ps1
Datei ein, nicht in eine .bat
Datei. Sie müssen Set-ExecutionPolicy RemoteSigned
als Administrator ausgeführt werden, wenn Sie noch nie zuvor ein PS-Skript ausgeführt haben.
Wenn Sie möchten, dass eine grafische Oberfläche mit ffmpegX stapelweise verarbeitet wird, versuchen Sie es mit Quick Batcher . Es ist kostenlos und verwendet Ihre letzten ffmpegX-Einstellungen, um Dateien zu konvertieren, die Sie darin ablegen.
Beachten Sie, dass Sie keine Ordner per Drag & Drop auf Quick Batcher ziehen können. Wählen Sie also Dateien aus und stellen Sie sie dann in Quick Batcher.
Nur dieser hat für mich funktioniert. Bitte beachten Sie, dass Sie den Ordner "newfiles" manuell erstellen müssen, in dem sich die Datei ffmpeg.exe befindet.
Konvertieren . Dateien zu .wav Audio Code:
for %%a in ("*.*") do ffmpeg.exe -i "%%a" "newfiles\%%~na.wav"
pause
dh wenn Sie alle .mp3-Dateien in .wav konvertieren möchten, ändern Sie ("*.*")
in ("*.mp3")
.
Der Autor dieses Skripts ist:
https://forum.videohelp.com/threads/356314-How-to-batch-convert-multiplex-any-files-with-ffmpeg
hoffe es hat geholfen 🙏.
Dadurch wird ein MP3-Video aus allen JPG-Dateien aus dem aktuellen Verzeichnis erstellt.
echo exec("ffmpeg -framerate 1/5 -i photo%d.jpg -r 25 -pix_fmt yuv420p output.mp4");
Und für Windows funktioniert dies nicht
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec mp3 "%~nG.mp3"
selbst wenn ich das verdopple %
.
Ich würde sogar vorschlagen:
-acodec ***libmp3lame***
ebenfalls:
FOR /F "tokens=*" %G IN ('dir /b *.flac') DO ffmpeg -i "%G" -acodec libmp3lame "%~nG.mp3"
Dies ist, was ich verwende, um AVI stapelweise in 1280x mp4 zu konvertieren
FOR /F "tokens=*" %%G IN ('dir /b *.avi') DO "D:\Downloads\ffmpeg.exe" -hide_banner -i "%%G" -threads 8 -acodec mp3 -b:a 128k -ac 2 -strict -2 -c:v libx264 -crf 23 -filter:v "scale=1280:-2,unsharp=5:5:1.0:5:5:0.0" -sws_flags lanczos -b:v 1024k -profile:v main -preset medium -tune film -async 1 -vsync 1 "%%~nG.mp4"
Funktioniert gut als Cmd-Datei, führen Sie es aus, die Schleife findet alle AVI-Dateien in diesem Ordner.
ruft MY (für Sie ändern) ffmpeg auf, übergibt den Eingabenamen, die Einstellungen dienen zum erneuten Skalieren mit Schärfen. Ich probs brauche kein CNI und " -b:v 1024k
" ...
Die Ausgabedatei ist die Eingabedatei abzüglich der Erweiterung, wobei mp4 als neue ext.
Ich verwende diesen Einzeiler unter Linux, um Dateien (normalerweise H265) in etwas zu konvertieren, das ich ohne Probleme auf Kodi abspielen kann:
for f in *.mkv; do ffmpeg -i "$f" -c:v libx264 -crf 28 -c:a aac -b:a 128k output.mkv; mv -f output.mkv "$f"; done
Dies wird in eine temporäre Datei konvertiert und ersetzt dann das Original, sodass die Namen nach der Konvertierung gleich bleiben.
Auch wenn Sie die gleiche Konvertierung in Unterordnern wünschen. Hier ist der rekursive Code.
for /R "folder_path" %%f in (*.mov,*.mxf,*.mkv,*.webm) do (
ffmpeg.exe -i "%%~f" "%%~f.mp4"
)
kleines PHP-Skript dafür:
#!/usr/bin/env php
<?php
declare(strict_types = 1);
if ($argc !== 2) {
fprintf ( STDERR, "usage: %s dir\n", $argv [0] );
die ( 1 );
}
$dir = rtrim ( $argv [1], DIRECTORY_SEPARATOR );
if (! is_readable ( $dir )) {
fprintf ( STDERR, "supplied path is not readable! (try running as an administrator?)" );
die(1);
}
if (! is_dir ( $dir )) {
fprintf ( STDERR, "supplied path is not a directory!" );
die(1);
}
$files = glob ( $dir . DIRECTORY_SEPARATOR . '*.avi' );
foreach ( $files as $file ) {
system ( "ffmpeg -i " . escapeshellarg ( $file ) . ' ' . escapeshellarg ( $file . '.mp4' ) );
}
escapeshellarg()
und funktioniert sowohl unter Windows als auch unter Linux. Ich bin damit einverstanden, dass es ein Randfall ist.
Eine andere einfache Lösung, die noch nicht vorgeschlagen wurde, wäre xargs
:
ls *.avi | xargs -i -n1 ffmpeg -i {} "{}.mp4"
Eine kleine Gefahr ist die umständliche Benennung von Ausgabedateien (z input.avi.mp4
. B. ). Eine mögliche Problemumgehung hierfür könnte sein:
ls *.avi | xargs -i -n1 bash -c "i={}; ffmpeg -i {} "\${i%.*}.mp4"
""