Windows: convierta de forma recursiva FLAC a MP3 con ffmpeg

Dec 09 2020

Tengo ffmpeg instalado y uso archivos por lotes para convertir MP4 h.264 a MKV x.265 con éxito, pero tengo un problema con la conversión de archivos FLAC a MP3 de 320 kbps sin necesidad de metadatos. Aunque muchas publicaciones explican cómo hacer esto en Linux, sus scripts no resuelven este problema cuando se ejecutan en el símbolo del sistema de Windows.

El script de línea de comando que he creado para convertir a MP3 tiene esta línea:

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

Al no ser un experto en Powershell, estoy buscando una solución de línea de comandos. No me importa si los metadatos sobreviven o no.

¿Cómo puedo modificar eso para convertir todos los archivos FLAC en el directorio actual y todos los subdirectorios debajo de él (como se muestra en el primer enlace de arriba para Linux)?

Respuestas

5 harrymc Dec 14 2020 at 17:28

El siguiente .batarchivo debería hacerlo:

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

Puede probarlo primero con este script:

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

Explicación de las sustituciones anteriores (se combinan en el script anterior):

  • %~dA - expande% A solo a una letra de unidad
  • %~pA - expande% A solo a una ruta
  • %~nA - expande% A solo a un nombre de archivo
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

  • Lo mismo sin definir / usar 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

¿Realmente necesitas usar .Flac dos veces?
¿Y siempre guardará todos los archivos convertidos en la misma carpeta (directorio de trabajo)?

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"falla con el mismo error que se señaló antes ...

1. Quitar ny.flac

for %%A in (*.flac) do ffmpeg -i "%%~
       
        n
       A
       
        .flac
       " -c:v copy -b:a 320k "%%~nA.mp3"
  • Obs .: 1 La Forvariable de bucle le "%%~A"proporciona la ruta completa al archivo de entrada, no necesita recortar el nombre y / o agregar explícitamente:

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

       
        "%%~dpn.Flac"
       

        
         "%%~N.Flac"
        

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

2. Utilice For /R:

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

3. Considere definir / agregar un drive:\folder\para guardar el archivo codificado de destino, no solo un nombre, si no para guardarlo en el mismo directorio de trabajo en el que se encuentra su bate.

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • Obs .: 2 Para guardar su .mp3en el directorio actual / trabajo, puede usar:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • Obs. :: 3 ¡¡ Todos los metadatos sobreviven !!

Uno sugiere usar 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 Para el uso de líneas de ruptura ^, no use ningún espacio / carácter después del signo de intercalación:


Recursos adicionales:

  • Set /?
  • For /?
  • For /F
  • For /R
  • Where /?
  • Timeout /?
  • Redirección
    • |, <, >, 2>, Etc.
  • Ejecución condicional
    • || y &&
  • Local Environment | Function| Consulte también:Goto :EOF
    • Setlocal Y Endlocal
  • Divida los comandos largos en varias líneas a través del archivo por lotes de Windows
  • ¿Cómo analiza el intérprete de comandos de Windows [ cmd.exe] las secuencias de comandos?