
Ich habe ffmpeg installiert und verwende Batchdateien, um MP4 h.264 erfolgreich in MKV x.265 zu konvertieren, aber ich habe ein Problem mit der Konvertierung von FLAC-Dateien in 320 kbps MP3 ohne Metadaten. ObwohlvieleBeiträgeerklärenwie das unter Linux geht, ihre Skripte lösen dieses Problem nicht, wenn sie in der Eingabeaufforderung von Windows ausgeführt werden.
Das Befehlszeilenskript, das ich zur Konvertierung in MP3 erstellt habe, enthält diese Zeile:
for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
Da ich mit Powershell nicht vertraut bin, suche ich nach einer Befehlszeilenlösung. Es ist mir egal, ob Metadaten erhalten bleiben oder nicht.
Wie kann ich das ändern, um alle FLAC-Dateien im aktuellen Verzeichnis und allen Unterverzeichnissen darunter zu konvertieren (wie im ersten Link oben für Linux gezeigt)?
Antwort1
Die folgende .bat
Datei sollte genügen:
for /R %%A in (*.flac) do ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Sie können es zuerst mit diesem Skript testen:
for /R %%A in (*.flac) do echo ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Erklärung für die obigen Ersetzungen (sie sind im obigen Skript kombiniert):
%~dA
- erweitert %A nur zu einem Laufwerksbuchstaben%~pA
- erweitert %A nur zu einem Pfad%~nA
- erweitert %A nur zu einem Dateinamen
Antwort2
@echo off
cd /d "%~dp0" & setlocal
set "_flag1=-c:v copy -b:a 320k"
set "_flag2=-hide_banner -v error -stats"
set "_ffmpeg="C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i"
for /r %%i in (*.Flac)do %_ffmpeg% "%%~i" %_flag1% "%%~dpni.mp3" %_flag2%
%__AppDir__%timeout.exe /t 5 /nobreak |echo=Is Done! & endlocal & goto :eof
- Dasselbe ohne Definition/Verwendung von Variablen:
@echo off & setlocal & cd /d "%~dp0"
for /r %%i in (*.Flac)do "C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i ^
"%%~i" -c:v copy -b:a 320k "%%~dpni.mp3" -hide_banner -v error -stats
%__AppDir__%timeout.exe /t 5 /nobreak |echo=Is Done! & endlocal & goto :eof
Brauchen Sie wirklich.Flaczweimal?
Und möchten Sie alle konvertierten Dateien immer im selben Ordner (Arbeitsverzeichnis) speichern?
for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)
vonffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"
schlägt mit dem gleichen Fehler wie zuvor fehl ...
1.Entfernen n
und.flac
for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
- Beob.: 1Die
For
Loop-Variable"%%~A"
liefert Ihnen den vollständigen Pfad zur Eingabedatei, Sie müssen den Namen nicht kürzen und/oder explizit hinzufügen:
"%~Drive\\Path\\Name.Flac"
"%%~dpn.Flac"
"%%~N.Flac"
rem :: use
ffmpeg -i "%%#~A" ...
2.Verwenden For /R
:
For /R %%i in (*.flac)do ...
3.Erwägen Sie die Definition/Hinzufügung eines Namens drive:\folder\
zum Speichern der Ziel-kodierten Datei, nicht nur eines Namens, wennnichtum es im selben Arbeitsverzeichnis zu speichern, in dem sich Ihr Bat befindet.
... (...)do.... ffmpeg ... "%%~dpni.mp3"
- Obs.: 2
.mp3
Um Ihre Datei im aktuellen/Arbeitsverzeichnis zu speichern , können Sie Folgendes verwenden:
... (...)do.... ffmpeg ... "%%~ni.mp3"
... (...)do.... ffmpeg ... ".\%%~ni.mp3"
... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
- Beob.:: 3Alle Metadaten bleiben erhalten!!
Man schlägt vor,For /F + where /R
@echo off
setlocal & cd /d "%~dp0"
for /f delims^= %%i in ('
2^>nul %__AppDir__%where.exe /r . *.flac
')do "C:\Program Files\FFmpeg\Bin\FFmpeg.exe" -i "%%~i" -c:v ^
copy -b:a 320k "%%~dpni.mp3" -hide_banner -v error -stats
%__AppDir__%timeout.exe 5 /nobreak |echo=Is Done! & endlocal & goto :eof
- Beob.:: 4Für die Verwendung von Trennlinien
^
verwenden Sie keineLeerzeichen/Zeichennach dem Caretzeichen:
Zusätzliche Ressourcen: