Windows: converta recursivamente FLAC para MP3 com ffmpeg
Instalei o ffmpeg e usei arquivos em lote para converter MP4 h.264 em MKV x.265 com sucesso, mas tenho um problema ao converter arquivos FLAC para MP3 de 320 kbps sem a necessidade de metadados. Embora muitos posts expliquem como fazer isso no Linux, seus scripts não resolvem esse problema quando executados no prompt de comando do Windows.
O script de linha de comando que criei para converter para MP3 tem esta linha:
for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
Não sendo adepto do Powershell, estou procurando uma solução de linha de comando. Eu não me importo se os metadados sobrevivem ou não.
Como posso modificar isso para converter todos os arquivos FLAC no diretório atual e todos os subdiretórios abaixo dele (conforme mostrado no primeiro link acima para Linux)?
Respostas
O seguinte .bat
arquivo deve fazer isso:
for /R %%A in (*.flac) do ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Você pode testá-lo primeiro com este script:
for /R %%A in (*.flac) do echo ffmpeg -i "%%A" -c:v copy -b:a 320k "%%~dpnA.mp3"
Explicação para as substituições acima (elas são combinadas no script acima):
%~dA
- expande% A apenas para uma letra de unidade%~pA
- expande% A para um caminho apenas%~nA
- expande% A para um nome de arquivo apenas
@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
- O mesmo sem definir / usar variáveis:
@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
Você realmente precisa usar .Flac duas vezes?
E você sempre vai salvar todos os arquivos convertidos na mesma pasta (diretório de trabalho)?
for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)
deffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"
falha com o mesmo erro observado antes ...
1. Remova n
e.flac
for %%A in (*.flac) do ffmpeg -i "%%~
n
A
.flac
" -c:v copy -b:a 320k "%%~nA.mp3"
- Obs .: 1 A
For
variável loop"%%~A"
fornece a você o caminho completo para o arquivo de entrada, você não precisa cortar o nome e / ou adicionar explicitamente:
"%~
Drive\\
Path\\
Name
.Flac"
"%%~dpn.Flac"
"%%~N.Flac"
rem :: use
ffmpeg -i "%%#~A" ...
2. Use For /R
:
For /R %%i in (*.flac)do ...
3. Considere definir / adicionar um drive:\folder\
para salvar o arquivo codificado de destino, não apenas um nome, se não para salvá-lo no mesmo diretório de trabalho em que seu bastão está.
... (...)do.... ffmpeg ... "%%~dpni.mp3"
- Obs .: 2 Para salvar seu
.mp3
no diretório atual / trabalho, você pode usar:
... (...)do.... ffmpeg ... "%%~ni.mp3"
... (...)do.... ffmpeg ... ".\%%~ni.mp3"
... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
- Obs. :: 3 Todos os metadados sobrevivem !!
Uma sugestão de uso 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 quebra de linha usando
^
, não use nenhum espaço / caractere após o acento circunflexo:

Recursos adicionais:
- Set /?
- For /?
- For /F
- For /R
- Where /?
- Timeout /?
- Redirecionamento
|
,<
,>
,2>
, Etc.
- Execução Condicional
- || e &&
- Local Environment | Function| Consulte também:Goto :EOF
- Setlocal E Endlocal
- Divida comandos longos em várias linhas por meio do arquivo de lote do Windows
- Como o Windows Command Interpreter [ cmd.exe] Analisa Scripts