使用ffmpeg将.flac转换为.mp3,保留所有元数据。

156

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


8
请注意,下次您应该在[su]上提出ffmpeg命令行使用问题。[so]只用于涉及编程的问题。此外,FLAC官方仅支持Vorbis注释格式(http://xiph.org/flac/format.html#format_overview),因此我假设您希望转换为ID3v2而不是“保留”。 - llogan
6
[tag:ffmpeg]标签显示:“关于FFmpeg命令行工具的交互使用问题应该在Super User上提问。”这并不是什么大不了的事,但我只是想指出这一点,因为在我看来这里有太多与主题无关的问题。 - llogan
8个回答

254
以下命令可以保持 .mp3(320kbps)的高音质,并将 .flac 文件中的元数据转换为 ID3v2 格式,这些格式可以包含在 .mp3 文件中:
ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3

2
值得注意的是,“ffmpeg”可能需要被替换为“avconv”。 - shockburner
12
值得一提的是,ffmpeg 3.2 版本会自动将元数据从 FLAC 复制到 ID3v2 中,无需指定 -map_metadata 0 -id3v2_version 3 参数,但不会复制到 ID3v1 标签中。我使用另外一个工具来完成该操作。 - Dai
2
歌词仍然无法复制。 - user151496
5
For循环转换(Windows的.bat脚本):for %%f in (*.flac) do (ffmpeg -i "%%f" -ab 320k -map_metadata 0 -id3v2_version 3 "%%f.mp3") - deadfish
5
使用PowerShell针对目录执行以下操作:dir *.flac | foreach {ffmpeg -i $_.FullName -ab 320k -map_metadata 0 -id3v2_version 3 $_.FullName.Replace('flac', 'mp3')} - Jared Beach
显示剩余5条评论

90

上面的回答非常完美。我使用它和find一起,用这个命令将子树中的所有FLAC文件添加到iTunes。

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

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

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

结果例如:

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

然后运行例如。

find . -name "*.mp3" -exec mv {} "/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized/" \;
自动将所有转换后的音轨添加到iTunes中。

未识别的选项 'name'。 - Furkan Gözükara
最终得到的是以.flac.mp3为后缀的文件。 - undefined

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

非常高的质量:适用于HiFi、家庭或安静的听音乐,最佳文件大小为 -V0 (~245 kbps)-V1 (~225 kbps)-V2 (~190 kbps)-V3 (~175 kbps)。建议使用这些可变比特率设置,通常会产生无损效果。这些预设之间可能存在听得出的差异,但是很少见。

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

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

使用 -qscale:a(或别名 -q:a)控制质量。这些值是编码器特定的,因此对于libmp3lame,范围为0-9,其中较低的值表示更高的质量。0-3 通常会产生透明效果,4(默认值)应该接近感知透明度,6 产生“可接受”的质量。选项 -qscale:a 被映射到独立的lame命令行界面工具中的 -V 选项。

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

如果您还想要ID3v1元标签,应添加 -write_id3v1 1 参数。

因此,我的最终命令是:

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

14

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

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

截至Ubuntu 16.04,上述命令似乎复制了(大部分?全部?)元数据。

-q:a 0告诉ffmpeg使用最高质量的可变比特率。

然而,ffmpeg将我的专辑封面从jpeg转换为png,这增加了封面艺术品的大小。

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

我猜上面的转换有点讲得通,因为它考虑了 ffmpeg 的工作方式

经过一些深入的挖掘,我找到了 -c:v copy 选项,它指定视频流应该被复制而不是转码。完整的命令如下:

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

上述命令的结果为:

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

这么多年过去了,我才发现这个小技巧…. -q:a 0-c:v copy 确实非常有帮助.. 谢谢。 :) - Andre Greeff

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

(为了方便理解,此处不翻译程序代码中的关键字)

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文件,但不会在名称中保留旧的文件扩展名。

1
非常感谢。顺便提一下,您的答案已在文章中得到了认可:https://quantixed.org/2021/11/20/convertible-using-ffmpeg-to-convert-audio-files。 - gustafbstrom

11

一行代码将单个目录中的所有 .flac 文件转换为 .mp3,保留大部分元数据:

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

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

ffmpeg: flac to mp3


2
只需像 "$file" 这样引用变量 $file - Chazy Chaz
4
":r" 似乎是 "zsh" 的一个修饰符,在 "bash" 中无效。在 Bash 中,你可以用 "${file%.flac}.mp3" 替换 "${file:r}.mp3"。 - mivk
3
在Bash中,如果要仅显示文件名,则可以使用${file%.*} - Evhz

3
这个 flac2mp3.sh 脚本使用 ffmpeg 将一个文件夹中的FLAC文件转换为另一个文件夹中的MP3文件。如果有封面图片,也会被包括在内。你可以设置一个 CORES 变量来创建后台任务,以一次转换多个文件。

提供错误 sed: -e 表达式 #1,字符 26:未终止的 `s' 命令。 - Furkan Gözükara

2

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

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


未识别选项“name”。 分割参数列表时出错:未找到选项。 - Furkan Gözükara
@MonsterMMORPG 你可能忘记在查找命令后输入“.”。这个“.”告诉查找命令在当前文件夹中查找,而“-name”则告诉它查找匹配的文件名。 - Dhiraj Gupta

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