我安装了 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对于断线使用
^
,请勿使用任何空格/字符在插入符号后:
其他资源: