Windows: convertir récursivement FLAC en MP3 avec ffmpeg

Dec 09 2020

J'ai installé ffmpeg et j'utilise des fichiers batch pour convertir avec succès MP4 h.264 en MKV x.265, mais j'ai un problème avec la conversion de fichiers FLAC en MP3 320 kbps sans métadonnées nécessaires. Bien que de nombreux articles expliquent comment faire cela sous Linux, leurs scripts ne résolvent pas ce problème lorsqu'ils sont exécutés dans l'invite de commande de Windows.

Le script de ligne de commande que j'ai créé pour convertir en MP3 a cette ligne:

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

N'étant pas adepte de Powershell, je recherche une solution en ligne de commande. Je me fiche de savoir si les métadonnées survivent ou non.

Comment puis-je modifier cela pour convertir tous les fichiers FLAC dans le répertoire actuel et tous les sous-répertoires en dessous (comme indiqué dans le premier lien ci-dessus pour Linux)?

Réponses

5 harrymc Dec 14 2020 at 17:28

Le .batfichier suivant devrait le faire:

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

Vous pouvez d'abord le tester avec ce script:

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

Explication des substitutions ci-dessus (elles sont combinées dans le script ci-dessus):

  • %~dA - étend% A à une lettre de lecteur uniquement
  • %~pA - étend% A à un chemin uniquement
  • %~nA - développe% A en un nom de fichier uniquement
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

  • La même chose sans définir / utiliser de variables:
@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

Avez-vous vraiment besoin d'utiliser .Flac deux fois?
Et vous allez toujours enregistrer tous les fichiers convertis dans le même dossier (répertoire de travail)?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)de ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"échoue avec la même erreur que celle indiquée précédemment ...

1. Retirez net.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • Obs .: 1 La Forvariable de boucle "%%~A"vous fournit le chemin complet du fichier d'entrée, vous n'avez pas besoin de recadrer le nom et / ou d'ajouter explicitement:

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

       
        "%%~dpn.Flac"
       

        
         "%%~N.Flac"
        

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

2. Utilisez For /R:

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

3. Tenir compte de définir / l' ajout d' un drive:\folder\pour enregistrer le fichier codé cible, non seulement un nom, si pas à enregistrer dans le même répertoire de travail de votre chauve - souris sont en.

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • Obs .: 2 Pour sauvegarder votre .mp3dans le répertoire courant / work, vous pouvez utiliser:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Obs. :: 3 Toutes les métadonnées survivent !!

On suggère d'utiliser 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 Pour utiliser la ligne de rupture ^, n'utilisez aucun espace / caractère après le signe d'insertion:


Ressources additionnelles:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • Redirection
    • |, <, >, 2>, Etc.
  • Exécution conditionnelle
    • || et &&
  • Local Environment | Function| Référez-vous également:Goto :EOF
    • Setlocal & Endlocal
  • Diviser les longues commandes en plusieurs lignes via le fichier de commandes Windows
  • Comment l’interpréteur de commandes Windows [ cmd.exe] analyse les scripts