Windows: convierta recursivamente FLAC a MP3 con ffmpeg

Windows: convierta recursivamente FLAC a MP3 con ffmpeg

Tengo ffmpeg instalado y uso archivos por lotes para convertir MP4 h.264 a MKV x.265 con éxito, pero tengo un problema al convertir archivos FLAC a MP3 de 320 kbps sin necesidad de metadatos. A pesar demuchospublicacionesexplicarcó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 anterior para Linux)?

Respuesta1

El siguiente .batarchivo debería hacerlo:

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

Puedes 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 guión anterior):

  • %~dA - expande %A solo a una letra de unidad
  • %~pA - expande %A solo a una ruta
  • %~nA - expande %A a un nombre de archivo solamente

Respuesta2

@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ás 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)from 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 "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
  • Obs.: 1La Forvariable de bucle "%%~A"le 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.Usar 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, sinopara guardarlo en el mismo directorio de trabajo en el que se encuentra su bat.

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

Uno sugiere usarFor /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.:: 4Para usar líneas de ruptura ^, no use ningunaespacios/carácterdespués del signo de intercalación:

ingrese la descripción de la imagen aquí


Recursos adicionales:

información relacionada