
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 .bat
archivo 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)
fromffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"
falla con el mismo error que se señaló antes...
1.Quitar n
y.flac
for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
- Obs.: 1La
For
variable 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
.mp3
en 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:
Recursos adicionales:
Set /?
For /?
For /F
For /R
Where /?
Timeout /?
- Redirección
|
,<
,>
,2>
, etc.
- Ejecución condicional
Local Environment | Function
| Consulte también:Goto :EOF
- Divida comandos largos en varias líneas a través de un archivo por lotes de Windows
- ¿Cómo analiza el intérprete de comandos de Windows [
cmd.exe
] los scripts?