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


88

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


5
请注意,下次您应该ffmpeg在“超级用户”中询问cli使用问题。堆栈溢出仅用于涉及编程的问题。另外,FLAC正式支持Vorbis注释,因此我假设您想转换为ID3v2,而不是“ keep”。
llogan's

好,我解决了我的问题。我在这里问是因为我在StackOverflow上看到了类似的问题(例如thisthis),并认为分享我的知识可能很有趣。另外,我看到有一个ffmpeg标记,那么为什么不在这里分享我的解决方案呢?ffmpeg被许多开发人员用于许多应用程序中。
Vito Gentile 2014年

3
ffmpeg的标签说,“关于交互使用FFmpeg的命令行工具的问题,应该问的超级用户。” 没什么大不了的,但是我只是想指出一点,因为我认为这里有太多的题外问题。
llogan

Answers:


152

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

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

1
值得注意的是,“ ffmpeg”可能需要替换为“ avconv”。
shockburner

5
FWIW ffmpeg3.2会自动将元数据从FLAC复制到ID3v2,而无需指定-map_metadata 0 -id3v2_version 3,尽管它不会复制到ID3v1标签。我为此使用了单独的工具。

1
歌词仍然没有被复制
user151496

1
如果有几个部分,它会分开吗?
Artyom

1
@Artyom您可能应该将提示文件与flac一起标记了分割点。如果是这样,则可以使用shnsplit(控制台)或flacon(GUI)来拆分文件并将零件转换为mp3。如果只有一个flac,则可以为其编写一个cui或使用ffmpeg的-ss-t选项将每首歌曲剪切掉。

56

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


3
/ Users / sir ”,lmao。
哈里·斯文森

轶事:我们公司的所有用户都有星号,缩写为3-5个字符。我的是“ sirius”,简短的先生;)
user2707001

无法识别的选项“名称”。
MonsterMMORPG

14

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

质量非常高:高保真音响,家中或安静的听,用最好的文件大小 -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映射到-V独立的Lame命令行界面工具中的选项。

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

8

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

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

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

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

但是,ffmpeg是将我的专辑封面从转换jpegpng,从而增加了封面的尺寸。

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))

3

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

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文件,而无需在名称中保留旧文件扩展名。


3

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

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

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

ffmpeg:flac到mp3


只是引用变量$file一样"$file"
Chazy Chaz

:r似乎是一个zsh修饰符,不适用于bash。在Bash中,您可以替换"${file:r}.mp3""${file%.flac}.mp3"
mivk

在bash中仅显示文件中的文件名${file%.*}
Evhz

2

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

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


无法识别的选项“名称”。拆分参数列表时出错:找不到选项
MonsterMMORPG,2016年

@MonsterMMORPG您可能会错过输入。在find命令之后。的。告诉find查找当前文件夹,-name告诉它查找匹配的文件名。
Dhiraj Gupta

2

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


给出错误sed:-e表达式#1,字符26:未
终止的

正是我想要的东西,谢谢!我对脚本进行了一些调整,以纳入VBR和其他答案,并在此处上传:gist
aksh1618
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.