Windows:使用 ffmpeg 递归地将 FLAC 转换为 MP3

Windows:使用 ffmpeg 递归地将 FLAC 转换为 MP3

我安装了 ffmpeg 并使用批处理文件成功将 MP4 h.264 转换为 MKV x.265,但在将 FLAC 文件转换为 320 kbps MP3 时遇到了问题,无需元数据。虽然许多帖子解释如何在 Linux 中执行此操作,在 Windows 命令提示符中运行时,它们的脚本无法解决此问题。

我创建的用于转换为 MP3 的命令行脚本包含以下行:

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

由于不擅长使用 Powershell,我正在寻找命令行解决方案。我不在乎元数据是否存留。

我该如何修改它以转换当前目录及其下的所有子目录中的所有 FLAC 文件(如上面第一个 Linux 链接所示)?

答案1

下面的.bat文件应该可以做到这一点:

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

您可以先用这个脚本进行测试:

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

对上述替换的解释(它们在上面的脚本中组合):

  • %~dA - 仅将 %A 扩展为驱动器号
  • %~pA - 仅将 %A 扩展至路径
  • %~nA - 仅将 %A 扩展为文件名

答案2

@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

  • 无需定义/使用变量也一样:
@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

你真的需要使用.Flac两次?
你总是将所有转换后的文件保存在同一个文件夹(工作目录)中吗?

for %%A in (.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
for /R %% A in (
.flac)失败并ffmpeg -i "%%~pI%%~nA.flac" -b:a 320k "%%~nA.mp3"出现与之前提到的相同的错误......

1.移除n.flac

for %%A in (*.flac) do ffmpeg -i "%%~nA.flac" -c:v copy -b:a 320k "%%~nA.mp3"
  • 观察:1循环For变量"%%~A"为您提供了输入文件的完整路径,您不需要裁剪名称和/或明确添加:
"%~Drive\\Path\\Name.Flac"
"%%~dpn.Flac"
"%%~N.Flac"

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

2.使用For /R

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

3.考虑定义/添加一个drive:\folder\来保存目标编码文件,而不仅仅是一个名称,如果不是将其保存在与你的 bat 相同的工作目录中。

 ... (...)do.... ffmpeg ... "%%~dpni.mp3"
  • 观察:2要将您的文件保存.mp3在当前/工作目录中,您可以使用:
 ... (...)do.... ffmpeg ... "%%~ni.mp3"
 ... (...)do.... ffmpeg ... ".\%%~ni.mp3"
 ... (...)do.... ffmpeg ... "%CD%\%%~ni.mp3"
  • 观察::3所有元数据均存活!

建议使用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
  • 观察::4对于断线使用^,请勿使用任何空格/字符在插入符号后:

在此处输入图片描述


其他资源:

相关内容