在Windows上使用FFmpeg递归地将FLAC转换为MP3,同时保留元数据和目录结构。

3
我想使用FFmpeg将我的音乐库中的所有.flac文件转换为.mp3文件,同时保留原始文件的元数据和目录结构。到目前为止,我已经让所有内容正常运作,除了保留目录结构
到目前为止,我已经完成了以下工作:
@echo off
rem Copies the original directory structure from F:\Music to D:\Music
xcopy /T %1 %2
rem Recursively converts files with .flac extension from F:\Music to .mp3 in D:\Music
for /R %1 %%i in (*.flac) do (
    echo Currently converting "%%~nxi"
    ffmpeg -v quiet -i "%%i" -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 "%2\%%~ni.mp3"
)
echo Completed.
pause

我觉得我的问题来源于将FFmpeg输出设为"%2\%%~ni.mp3",但是我无法让它保留原始目录结构。我已经尝试了dpni作为输出选项,但是转换后不正确。
批处理文件是通过命令行执行的convert F:\Music D:\Music 原始目录中的所有音乐都具有F:\Music\Artist Name\Album Name\Song.flac结构,我希望它最终变成D:\Music\Artist Name\Album Name\Song.mp3。
或者,有没有一种方法可以在源文件所在目录中将.flac转换为.mp3,然后删除.flac?

你尝试过 "%~d2%%~pni.mp3" 吗? - Gyan
谢谢,它像魔法一样奏效了! - elgo2006
2个回答

3
当 for /R 递归到子文件夹时,原始的 %2 不包括这些子文件夹的名称,因此尝试使用以下命令:
ffmpeg -v quiet -i "%%~fi" -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 "%~d2%%~pni.mp3"

做到了,谢谢!所以尽管它复制了原始的目录结构,没有~d的参考,它却不理解驱动器是什么? - elgo2006
~d 只从 %2 中获取驱动器,当前完整路径使用 %%~pni 获取。请参阅 for /? 中的修改器部分。 - user6811411
请注意,我的方法之所以有效,是因为您在两个驱动器上具有相同的文件夹名称。如果它们不同,则需要进行字符串替换。 - user6811411

1

这里有一个通用的解决方案,即使源目录和目标根目录不仅在驱动器字母上有所不同也可以使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=F:\Music"
set "_TARGET=D:\Music"

rem // Change to source directory temporarily:
pushd "%_SOURCE%" || exit /B 1
rem // Enumerate source files, return paths relative to the source directory:
for /F "delims=" %%F in ('xcopy /L /S /I ".\*.flac" "%_TARGET%" ^| find ".\"') do (
    echo Currently converting "%%F"...
    rem // Create destination directory, suppress error if it aready exists:
    mkdir "%_TARGET%\%%F\.." 2> nul
    rem // Perform actual file conversion, using paths relative to target directory:
    ffmpeg -v quiet -i "%%F" -q:a 0 -map_metadata 0 -id3v2_version 3 ^
        -write_id3v1 1 "%_TARGET%\%%F\..\%%~nF.mp3"
)
echo Completed.
popd

endlocal
exit /B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接