Mass .flac-> .mp3转码:如何编写可保留ID3标签信息的shell脚本?


9

最近几周,我已经从一种相当“动手”的方法开始对.flac-> .mp3进行转码,而不再是一种“设置后忘记”的方法。

第一步是停止使用GUI前端(带有LAME插件的Audacity),而是使用我在此处概述的方法。

第二步是找到一个bash shell脚本,该脚本将告诉该命令循环递归地工作,从而允许在一个简单的步骤中对包含许多包含.flac文件的子目录的目录进行转码。该答案由askubuntu.com上的用户提供。

现在,我想学习如何进一步优化,以保留ID3标签信息。链接到上述带ID3标签数据的方法,仅保留最低限度(即仅保留标题字段)。

谁能教我如何编写这样的shell脚本?


Shell脚本已更新,因此:

#!/bin/bash
file="$1"
flac -cd "$file" | lame --preset fast extreme - "${file%.flac}.mp3"
id3cp "$file" "${file%.flac}.mp3"

这样find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;在〜/桌面/堆栈提供了以下的输出:

01 - Amon Tobin - Chomp Samba.flac: done         
LAME 3.98.4 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding <stdin> to ./01 - Amon Tobin - Chomp Samba.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III VBR(q=0)
Parsing ./01 - Amon Tobin - Chomp Samba.flac: done.  Copying to ./01 - Amon Tobin - Chomp Samba.mp3: done

id3info 原始.flac和合成.mp3分别给出:

*** Tag information for 01 - Amon Tobin - Chomp Samba.flac

(即无);

*** Tag information for 01 - Amon Tobin - Chomp Samba.mp3
*** mp3 info
MPEG1/layer III
Bitrate: 128KBps
Frequency: 44KHz

.flac绝对具有标签信息。我可以通过打开EasyTAG来验证这一点。EasyTAG将其称为“ FLAC Vorbis标签”,但将其称为.mp3的“ ID3标签”。这是问题吗?


您是否尝试过使用ffmpeg
Hello71 2011年

不,我没有。老实说,以前从未在CLI上真正使用过它。有人告诉我有关 Perl脚本的信息。明天我会尝试的,因为现在已经晚了,请返回报告。
boehj 2011年

Answers:


7
#!/bin/sh

file="$1"
outfile=${file%.flac}.mp3

eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/")

flac -cd "$file" | lame --preset fast extreme \
        --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \
        --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \
        - "$outfile"

谢谢Kambus!这几乎可以解决问题。我想要的大多数标签现在都在这里,转码后:标题,专辑,艺术家,年份,曲目号。CD字段(1 / 1、1 / 2等)没有划过,“ Track Number Of ” 字段也没有。但这并没有真正打扰我。有趣的是,我在包含“ Trip Hop”音乐的目录上尝试了此脚本。标签保持完好无损,但脚本将类型从“ Trip Hop”更改为“ Trip-Hop”。因此,我想它依赖于那里已知类型的数据库。再次非常感谢您的输入!
boehj 2011年

@pedrogent:很高兴能为您提供帮助!您可以手动检查带有“ metaflac --export-tags-to-file”的其他标签,并与$ TITLE和其他标签相同地使用它们,但是问题是在id3 AFAIK中没有等效的字段。也许您可以将它们放在注释标签中。是的,有一个预定义的类型列表:链接
Kambus 2011年

嗨,Kambus。是的,我认为部分问题是ID3标签数据没有明确的“标准”。注释标记的解释因播放器而异(或根本没有)。您的脚本很棒。再次感谢。
boehj 2011年

1

如何使用mp3fs将flac大量编码为mp3

您可以使用mp3fs来将它们显示为虚拟mp3,而不是使用程序将flac文件转换为mp3,并且可以将复制作业排队。它对我来说效果很好。

下载并安装mp3fs和ultra影印机:

sudo apt-get install mp3fs ultracopier

为要运行的每个mp3fs创建一个flac和mp3目录对。我有一个双核CPU,所以我运行两个。如果将flac目录保留在flac文件所在的分区上,则可以快速将其移动。该分区在我的系统上称为“存储”。

cd /media/Storage
mkdir mp3fs mp3fs/flac_1 mp3fs/mp3_1 mp3fs/flac_2 mp3fs/mp3_2

您可以从命令行挂载目录,也可以将其添加到中/etc/fstab。您还可以在安装时配置虚拟mp3的比特率和编码算法。我希望mp3具有320kbps的恒定比特率,而la脚可能会花费所有时间来制作可能的最佳mp3。

在命令行上:

mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 -o allow_other,ro
mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 -o allow_other,ro

如果保险丝抱怨,像

fusermount:无法打开/etc/fuse.conf:权限被拒绝
fusermount:选项allow_other仅当在etc / fuse.conf中设置了“ user_allow_other”时才允许

然后取消注释中的user_allow_other选项/etc/fuse.conf,和/或使其可读

sudo chmod 644 /etc/fuse.conf

或来自/etc/fstab

mp3fs#/media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 fuse user,ro,allow_other,bitrate=320,quality=0 0 0
mp3fs#/media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 fuse user,ro,allow_other,bitrate=320,quality=0 0 0

将目录添加到后/etc/fstab,您可以使用来挂载它们

sudo mount -a

做完了!启动超复印机。它将在您的gnome面板或您使用的任何图标中放置一个指示器图标。单击它,选择添加副本。我做了两次以使用两个内核。使用文件浏览器将一些flac移到flac_1中。导航到mp3_1目录,然后将mp3拖到超级复印机窗口之一中以启动复制队列。Ultra影印机将询问文件的目的地。现在,您有一个核心忙于将一批flac编码为mp3。

要使用其他核心,请将flac文件移动到flac_2,然后将mp3从mp3_2拖动到第二个超复印机窗口。

更新:我现在使用的是MiniCopier,而不是超复印机,使用起来有点简单。请参阅下面的评论。


似乎是与目录与最新版本mp3fs和保险丝上市的错误:sourceforge.net/tracker/...
奥迪安

@Ophidian:有趣。我在使用不同发行版的某些计算机上进行了一些测试。我让它们运行了,每分钟都没有任何错误。我一直在使用的mp3fs版本是0.30。我使用了内核2.3.38、2.3.39和3.0.0,libfuse版本2.8.4和2.8.6。错误报告中提到的Libfuse是2.8.5。仅仅得出保险丝是罪魁祸首还远远不够,但是,如果在使用2.8.5时遇到问题,则可能值得尝试使用其他版本。您是否尝试过mp3fs?在哪个内核上以及在哪个libfuse上?你有什么问题吗?
Arjan Drieman

我现在使用的是MiniCopier,而不是超复印机,使用起来更简单了。这是一个Java应用程序,不需要安装,但需要JRE。它有一个购物篮图标和一个框图标。您可以将一个或多个源从文件管理器拖到购物篮图标上,将目标目录拖到框图标上,这就是将复制作业添加到队列中所需要做的全部工作。MiniCopier对失败的项目有一个单独的选项卡。MiniCopier使用的CPU周期比超级复印机少,在我的系统上是1%比3%。这可能只需要在10个小时的队列中节省12分钟;-)
Arjan Drieman

如果您想要基于shell的复制队列,我在superuser找到了一个解决方案。没有调整,您将无法使用它运行2个队列,而且我不确定它将如何处理错误。
Arjan Drieman

0

id3cp由于FLAC不使用ID3,因此无法工作;它改用Vorbis标签。

avconv可以选择通过转化维护代码。它有些善变,其值取决于编解码器的组合,但在您的情况下(版本9.16-6)它是这样工作的:

avconv -i in.flac -map_metadata 0:g:0 out.mp3

将这所有FLAC文件(递归地)应用到文件夹中就像这样简单:(使用bash

for f in */**/*.flac; do
  avconv -i "${f}" -map_metadata 0:g:0 "`echo "${f}" | sed -e s/flac$/mp3/`";
done

注意avconv自动使用uses脚;还有其他控制质量的选项。检查man avconv细节。

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.