在批处理模式下从命令行将专辑封面添加到mp3 / ogg文件吗?


38

我正在寻找Linux中的软件,该软件将以批处理模式将Album-Art / cover添加到每个选定的文件中。专辑封面是存储在我计算机中的jpg / png。如果可以从Internet导入,那将很棒。

目前,我已经尝试了Rhythmbox和Banshee。我也尝试过lameeasytag,但是似乎它们不支持批处理模式。lame添加属性,但覆盖。(我知道la脚是到目前为止s / wi使用的唯一命令行)。

因此,基本上我正在寻找:

<some magic s/w> --picture=<my chosen picture> Music/Artist/*.mp3

这样会将图片永久添加到文件的元数据中。

你能建议我任何这样的软件吗?

Answers:


24

使用lame您可以使用一些脚本执行此操作:

$ lame --ti /path/to/file.jpg audio.mp3

如果文件的命名如下,则可以制作一个shell脚本来执行您想要的操作:

for i in file1.mp3 file2.mp3 file3.mp3; do
  albart=$(echo $i | sed 's/.mp3/.jpg/')
  lame --ti /path/to/$albart $i
done

您可以在略高于更加紧凑,且无需对sed使用bash有它去掉后缀的匹配来做到这一点:

...
albart="${i%.mp3}.jpg"
...

Picard / MusicBrainz

如果您想大规模进行此操作,建议您使用Picard,它是使用MusicBrainz数据库的前端工具。Picard有一个名为“ Cover Art Downloader”的插件,可以对您的收藏进行批量处理。

上面的内容似乎不是命令行驱动的。

甜菜

另一种选择是使用beets。这可以从命令行驱动,并利用MusicBrainz数据库来采购专辑封面。

您可以使用源专辑封面FetchArt插件或使用其嵌入EmbedArt插件

还有其他选择吗?

还请看一下之前询问过的U&L问答,标题为:哪种mp3标记工具适用于Linux?。此线程中列出了几种替代工具。


您可以使用来避免sed通话albart="${i%.mp3}.jpg"。更重要的是,我刚刚测试了您的lame: unrecognized option -i
la脚

@evilsoup-谢谢,开关缺少破折号。应该是--ti ..
slm

@evilsoup-还添加了有关不使用的反馈sed。谢谢!
slm

7
@ Exeleration-G-不,我不建议使用lame它,因为它实际上是编码器。还有其他一些工具只能处理mp3的id3标签。您可以使用id3v2 -r "APIC" *.mp3eyeD3 --remove-all-images *.mp3删除任何附加的图像。
slm

1
仅供参考,我的3.99版没有“ --ti”选项(debian破坏者)-eyeD3似乎是一个不错的选择。
本杰明·彼得

17

一种解决方案是使用ffmpeg:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

您可以将其放入for循环中以执行目录中的每个MP3:

for f in ./*.mp3; do ffmpeg -i "$f" -i cover.jpg -map_metadata 0 -map 0 -map 1 out-"${f#./}"; done

这将创建一个单独的输出文件(因此,如果您有一个名为的文件foo.mp3,则将以foo.mp3和结尾。out-foo.mp3);这是因为ffmpeg无法覆盖其输入。您可以使用以下方法解决此问题:

for f in ./*.mp3; do \
ffmpeg -i "$f" -i cover.jpg -map_metadata 0 -map 0 -map 1 out-"${f#./}" \
&& mv out-"${f#./}" "$f"; done

使用ffmpeg解决这个问题有点像使用巡航导弹破解螺母。当然,更专业的元数据操作工具肯定可以用更简洁,更短的命令来做到这一点。


6
此处显示的ffmpeg命令将对音频进行编码。如果您要从其他格式进行转换,那很好,但是,如果您只是想将艺术作品添加到现有的mp3中而不进行重新编码,请在-acodec copy后面添加-map 1
jsd 2015年

这对我不起作用,有任何特殊原因吗?我只得到mp3文件,但没有缩略图。@jsd
法老大厨

抱歉@ChefPharaoh,我不知道为什么它对您不起作用。我只是尝试在添加艺术品的同时执行wav-> mp3,并且只是使用上面显示的ffmpeg命令将艺术品添加到现有的mp3中。两次都运行良好。
jsd

@evilsoup我不确定我是否在做某些超级邪恶或错误的事情,但是我可以使用进程替换来修改我的mp3文件。Kinda简化了该脚本,而且看起来非常快。
rien333 '18 -10-30

像对待对待一样,我也发现ffmpeg的速度比la脚要快:)
Tina

7

对于MP3:

eyeD3 --add-image="cover.jpg":FRONT_COVER "file.mp3"

对于FLAC:

metaflac --import-picture-from="cover.jpg" "file.flac"

OGG / Vorbis似乎更复杂


5

您可以为此使用FancyAudio gem。它可以将专辑封面添加到mp3文件中。 文档在此处获得

特征

  1. 将专辑封面添加到单个mp3文件
  2. 将专辑封面添加到多个mp3文件中。

下面的屏幕截图显示了在包含图像和多个mp3文件的文件夹中运行时fancy_audio的输出

在此处输入图片说明

下面的屏幕截图显示了在包含mp3和图像文件的文件夹中运行时fancy_audio的输出

此图显示了在包含mp3和图像文件的文件夹中运行时fancy_audio的输出


这很容易,并且比lame将同一图像添加到多个mp3文件时更快。您不需要了解Ruby;)-这是一个独立的脚本。
Tomasz Gandor

0

OP指出,如果从网络上下载封面,他会更喜欢。我刚刚使用eye3D和编写了一个不错的脚本sacad,两者均可从pip安装。eye3D这对于此目的非常有用,因为它似乎无法重新编码音频,并且使用该--to-v2.4标志可以处理任何mp3文件,无论id3标签的类型如何。该脚本应从包含mp3文件的目录中启动。它可以不带参数运行,可以从id3标签猜测艺术家和专辑名称,也可以以手册名称作为参数运行,例如embedart "pink floyd" "dark side of the moon"。它是为鱼壳编写的,但是如果将所有set命令更改为bash变量分配,则应易于移植到bash。

function embedart
    if echo $argv | grep -q -e '-h'
       echo 'embedart "[Artist]" "[Album]"'
       return
    end

    if test $argv[1]
        set artist $argv[1]
        set album $argv[2]
    else
        set artist (eyed3 (ls *mp3 | head -1) | ggrep -oP "artist.*: \K.*" | head -1)
        if not test $artist
            echo "No artist found!"
            return
        end
        set album (eyed3 (ls *mp3 | head -1) | ggrep -oP "album.*: \K.*" | head -1)
        if not test $album
            echo "No album found!"
            return
        end
    end

    sacad $artist $album 350 cover.jpg -v warning 2> /dev/null > /dev/null
    eyeD3 --to-v2.4 --add-image "cover.jpg:FRONT_COVER" *mp3 -Q 2> /dev/null > /dev/null

    rm cover.jpg
    echo "Done!"
end

-1

eyeD3 不适用于Unicode。如果.mp3文件名中(或什至仅是祖先目录名,如Album目录)中有任何非ascii字符,则它将中止。LTA。

因此,如果专辑或歌曲标题不是用英语写的,那么您真不走运!

例如:

cp yoursong.mp3 /tmp/Странджанска.mp3
eyeD3 --add-image folder.jpg:FRONT_COVER Странджанска.mp3

显然eyeD3希望将.mp3文件的完整路径放入.mp3文件中,并且无法处理非ASCII字符。

未捕获的异常:“ ascii”编解码器无法对位置5-16中的字符进行编码:序数不在范围内(128)
eyed3:错误:“ ascii”编解码器无法对位置5-16中的字符进行编码:序数不在范围内(128)
追溯 
...(省略长的追溯)...
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.