Windows: FLAC rekursiv in MP3 mit ffmpeg konvertieren

Dec 09 2020

Ich habe ffmpeg installiert und verwende Batch-Dateien, um MP4 h.264 erfolgreich in MKV x.265 zu konvertieren, aber ich habe ein Problem mit der Konvertierung von FLAC-Dateien in MP3 mit 320 kbps ohne Metadaten. Obwohl in vielen Beiträgen erläutert wird, wie dies unter Linux funktioniert, lösen ihre Skripte dieses Problem nicht, wenn sie an der Eingabeaufforderung von Windows ausgeführt werden.

Das Befehlszeilenskript, das ich zum Konvertieren in MP3 erstellt habe, enthält folgende Zeile:

for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"

Da ich nicht mit Powershell vertraut bin, suche ich nach einer Befehlszeilenlösung. Es ist mir egal, ob Metadaten überleben oder nicht.

Wie kann ich das ändern, um alle FLAC-Dateien im aktuellen Verzeichnis und alle Unterverzeichnisse darunter zu konvertieren (wie im ersten Link oben für Linux gezeigt)?

Antworten

5 harrymc Dec 14 2020 at 17:28

Die folgende .batDatei sollte es tun:

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 Substitutionen (sie werden im obigen Skript kombiniert):

  • %~dA - erweitert% A nur zu einem Laufwerksbuchstaben
  • %~pA - erweitert% A nur zu einem Pfad
  • %~nA - erweitert% A nur auf einen Dateinamen
2 ItWasn'tMe Dec 14 2020 at 21:09
@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

  • Das gleiche ohne Variablen zu definieren / zu verwenden:
@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

Müssen Sie .Flac wirklich zweimal verwenden?
Und Sie werden immer alle konvertierten Dateien in demselben 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)from ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"schlägt mit dem gleichen Fehler wie zuvor angegeben fehl ...

1. Entfernen nund.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • Anmerkung: 1 Die ForSchleifenvariable "%%~A"bietet Ihnen den vollständigen Pfad zur Eingabedatei. Sie müssen den Namen nicht zuschneiden und / oder explizit hinzufügen:

       
        "%~
        Drive\\
        Path\\
        Name
        .Flac"
       

       
        "%%~dpn.Flac"
       

        
         "%%~N.Flac"
        

rem :: use
ffmpeg -i  "%%#~A" ...

2. Verwenden Sie For /R:

For /R %%i in (*.flac)do ...

3. Erwägen Sie, eine drive:\folder\zu definieren / hinzuzufügen , um die Zielcodierte Datei zu speichern, nicht nur einen Namen, wenn Sie sie nicht in demselben Arbeitsverzeichnis speichern möchten, in dem sich Ihr Schläger befindet.

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • Obs.: 2 Um Ihre .mp3im aktuellen / work-Verzeichnis zu speichern, können Sie Folgendes verwenden:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Obs. :: 3 Alle Metadaten bleiben erhalten !!

Man schlägt vor, zu verwenden 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
  • Obs. :: 4 Verwenden Sie für ^die Verwendung von Unterbrechungslinien keine Leerzeichen / Zeichen nach dem Caret:


Zusätzliche Ressourcen:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • Umleitung
    • |, <, >, 2>, Usw.
  • Bedingte Ausführung
    • || und &&
  • Local Environment | Function| Siehe auch:Goto :EOF
    • Setlocal & Endlocal
  • Teilen Sie lange Befehle in mehrere Zeilen durch die Windows-Batchdatei
  • Wie analysiert der Windows-Befehlsinterpreter [ cmd.exe] Skripte?