关于转换器:使用ffmpeg将.flac转换为.mp3,并保留所有元数据

Convert .flac to .mp3 with ffmpeg, keeping all metadata

如何使用ffmpeg将.flac转换为.mp3,同时保留所有元数据(即将.flac文件中的Vorbis注释转换为.mp3的ID3v2元数据)?


以下命令可确保.mp3(320 kbps)上的高质量,并将.flac文件中的元数据转换为ID3v2格式,该格式可包含在.mp3文件中:

1
ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3


上面的完美答案。我将其与find一起使用,使用此命令将子树中的所有FLAC文件添加到iTunes

1
find . -name"*.flac" -exec ffmpeg -i {} -ab 160k -map_metadata 0 -id3v2_version 3 {}.mp3 \\;

要将结果文件自动添加到iTunes,请使用以下命令获取iTunes导入目录

1
find ~/Music/ -name"Automatically Add*"

结果例如

1
/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized

然后运行例如

1
find . -name"*.mp3" -exec mv {}"/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized/" \\;

自动将所有转换后的曲目添加到iTunes。


如果您想节省一点空间,请尝试hydrogenaud.io的建议:

Very high quality: HiFi, home, or quiet listening, with best file size
-V0 (~245 kbps), -V1 (~225 kbps), -V2 (~190 kbps) or -V3 (~175 kbps) are recommended.
These VBR settings will normally produce transparent results. Audible differences between these presets may exist, but are rare.

资料来源:http://wiki.hydrogenaud.io/index.php?title=LAME

如果要在ffmpeg中使用此选项,则应使用-q:a 0别名。

Control quality with -qscale:a (or the alias -q:a). Values are encoder specific, so for libmp3lame the range is 0-9 where a lower value is a higher quality. 0-3 will normally produce transparent results, 4 (default) should be close to perceptual transparency, and 6 produces an"acceptable" quality. The option -qscale:a is mapped to the -V option in the standalone lame command-line interface tool.

资料来源:https://trac.ffmpeg.org/wiki/Encode/MP3

如果也需要ID3v1元标记,则应添加-write_id3v1 1参数。

所以我的最终命令是:

1
ffmpeg.exe -y -i input.flac -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 output.mp3

我正在测试以下命令,将infile.flac文件转换为outfile.mp3

1
ffmpeg  -i infile.flac  -q:a 0  outfile.mp3

从Ubuntu 16.04开始,上述命令似乎可以复制(大部分?全部?)元数据。

-q:a 0告诉ffmpeg使用最高质量的VBR。

但是,ffmpeg将我的专辑封面从jpeg转换为png,这增加了封面的大小。

1
2
3
Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> png (native))
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

(考虑到ffmpeg的工作原理,上述转换很有意义。)

经过一番挖掘,我发现了-c:v copy选项,该选项指定应复制视频流,而不是对其进行转码。完整的命令是:

1
ffmpeg  -i infile.flac  -c:v copy  -q:a 0  outfile.mp3

上面的命令导致:

1
2
3
Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

一线式将所有.flac文件转换为单个目录中的.mp3,并保留大多数元数据:

for file in *.flac; do ffmpeg -i $file -q:a 0 ${file:r}.mp3; done

(注意:${file:r}删除给定文件路径的扩展名)

ffmpeg: flac to mp3


为了在mp3中递归转换嵌套文件夹中的所有flac文件,我使用了以下命令:

1
find '~/Music/' -iname '*.flac' -exec bash -c 'D=$(dirname"{}"); B=$(basename"{}"); mkdir"$D/mp3/"; ffmpeg -i"{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame"$D/mp3/${B%.*}.mp3"' \\;

它将在其中包含flac文件的文件夹中创建一个名为" mp3"的文件夹,并且在mp3文件夹中,它将以320kbps的比特率保存相对的mp3文件,而无需在名称中保留旧文件扩展名。


我知道并没有要求这样做,但是考虑到这样做的原因之一(至少这是我想要做的)是为了可以将音乐导入不支持FLAC的Apple iTunes。在这种情况下,将FLAC转换为Apple自己的无损格式m4a更有意义。我使用此命令转换了当前文件夹中的所有文件,同时保留了相似的文件大小。

find . -name"*.flac" -exec ffmpeg -i {} -map_metadata 0 -acodec alac {}.m4a \\;


此flac2mp3.sh脚本使用ffmpeg将FLAC文件的文件夹树转换为MP3文件的另一个文件夹树。如果存在的话,包括封面。您可以设置一个CORES变量来创建后台作业,以一次转换多个文件。