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

Posted

技术标签:

【中文标题】使用 ffmpeg 将 .flac 转换为 .mp3,保留所有元数据【英文标题】:Convert .flac to .mp3 with ffmpeg, keeping all metadata 【发布时间】:2014-11-24 10:22:57 【问题描述】:

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

【问题讨论】:

请注意,下次您应该在Super User 询问ffmpeg cli 使用问题。 Stack Overflow 仅适用于涉及编程的问题。此外,仅 FLAC officially supports Vorbis comment,所以我假设您想转换为 ID3v2 而不是“保留”。 好的,我解决了我的问题。我在这里问是因为我在 *** 上看到了这样的问题(例如 this 或 this),并认为分享我的知识可能会很有趣。另外,我看到有一个ffmpeg tag,那么为什么不在这里分享我的解决方案呢? ffmpeg 被很多开发者用在很多应用程序中。 ffmpeg 标签说:“有关 FFmpeg 命令行工具的交互使用的问题应该在超级用户上提出。”。这没什么大不了的,但我只是想指出这一点,因为我认为这里有太多离题的问题。 【参考方案1】:

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

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

【讨论】:

值得注意的是,“ffmpeg”可能需要替换为“avconv”。 FWIW ffmpeg 3.2 自动将元数据从 FLAC 复制到 ID3v2,而无需指定 -map_metadata 0 -id3v2_version 3,尽管它不会复制到 ID3v1 标签。我为此使用了一个单独的工具。 歌词仍然没有被复制 如果有几个部分,它会分flac吗? @Artyom 您应该有 cue 文件以及标记分割点的 flac 文件。如果是这样,那么您可以使用 shnsplit (控制台) 或 flacon (GUI) 来拆分文件并将部分转换为 mp3。如果你只有一个 flac 你可以为它写一个 cui 或者使用 ffmpeg 的 -ss-t 剪切每首歌曲的选项。【参考方案2】:

上面的完美答案。我将它与 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。

【讨论】:

"/Users/sir", lmao. 轶事:我们公司所有用户都有明星名字,缩写为3-5个字符。我的是“天狼星”,简短的先生;) 无法识别的选项“名称”。【参考方案3】:

如果你想节省一点空间,试试hydrogenaud.io的推荐:

非常高品质:HiFi、家庭或安静聆听,文件大小最佳 推荐-V0 (~245 kbps)-V1 (~225 kbps)-V2 (~190 kbps)-V3 (~175 kbps)。 这些 VBR 设置通常会产生透明的结果。这些预设之间可能存在听觉差异,但很少见。

来源: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

【讨论】:

【参考方案4】:

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

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

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

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

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

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

(我猜上面的转换有点意思given how ffmpeg works。)

经过一番挖掘,我找到了-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))

【讨论】:

【参考方案5】:

为了递归地将嵌套文件夹中的所有 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 文件,而不会在名称中保留旧的文件扩展名。

【讨论】:

非常感谢。仅供参考,您的回答记在一篇文章中:quantixed.org/2021/11/20/…。 感谢@gustafbstrom 的参考! FFMPEG 太强大了!干杯:-) 仅供参考:我不是作者,只是想给你一个提示:)【参考方案6】:

在一个目录中将所有.flac 文件转换为.mp3,同时保留大部分元数据:

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

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

【讨论】:

只需引用变量$file,如"$file" :r 似乎是 zsh 修饰符,在 bash 中不起作用。在 Bash 中,您可以将 "$file:r.mp3" 替换为 "$file%.flac.mp3" 只显示文件中的文件名,在 bash 中使用 $file%.*【参考方案7】:

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

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

【讨论】:

无法识别的选项“名称”。拆分参数列表时出错:找不到选项 @MonsterMMORPG 你可能错过了输入 .在 find 命令之后。这 。告诉 find 在当前文件夹中查找,-name 告诉它查找匹配的文件名。【参考方案8】:

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

【讨论】:

给出错误 sed: -e expression #1, char 26: unterminated `s' command 正是我想要的,谢谢!我稍微调整了脚本以合并 VBR 和其他答案,在此处上传:gist

以上是关于使用 ffmpeg 将 .flac 转换为 .mp3,保留所有元数据的主要内容,如果未能解决你的问题,请参考以下文章

python调用ffmpeg批量转换音频flac、mp3、m4a

使用python将任何音频文件转换为mp3

如何将flac格式的音频文件转换为MP3格式?

如何使用 PHP 将 .flac 转换为 .mp3 [关闭]

将.flac文件转换为.mp3

markdown FLAC到MP3 - ffmpeg