使用 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”。 FWIWffmpeg
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