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

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

最近几周,我已经从一种相当“动手”的 .flac --> .mp3 转码方法,转变为一种更加“设置后忘记”的方法。

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

第二步是找到一个 bash shell 脚本,它会告诉命令循环递归地工作,从而允许通过一个简单的步骤对包含许多子目录的目录进行转码。那回答由 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"

在 ~/Desktop/stack 中执行操作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 标签”。这是问题所在吗?

答案1

#!/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"

答案2

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

您可以使用 mp3fs 将它们呈现为虚拟 mp3,以及可以对复制作业进行排队的程序,而不是使用程序将 flac 文件转换为 mp3。它对我来说效果非常好。

下载并安装 mp3fs 和 ultracopier:

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 的比特率和编码算法。我想要 320kbps 恒定比特率的 mp3,而 lame 可能会花费所有时间来生成尽可能最好的 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:只有在etc/fuse.conf中设置了“user_allow_other”时才允许选项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 拖到超级复印机窗口之一以启动复制队列。 Ultracopier 将询问文件的目的地。现在,您有一个核心正忙于将一批 flac 编码为 mp3。

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

更新:我现在使用 MiniCopier,而不是 ultracopier,它更容易使用。请参阅下面的评论。

答案3

id3cp无法工作,因为 FLAC 不使用 ID3;它使用 Vorbis 标签代替。

ffmpeg可以选择通过转换来维护标签。这有点善变,它值取决于编解码器的组合,但在你的情况下它的工作原理如下(版本 3.4.8):

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

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

for f in */**/*.flac; do
  ffmpeg -i "${f}" -map_metadata 0:g:0 "${f%.flac}.mp3";
done

注意ffmpeg自动使用lame;存在进一步的选择来控制质量等。检查man ffmpeg详细信息。

答案4

拉斐尔的回答对我帮助很大。然而,为了使我的 FLAC 文件集正常工作,我必须手动调整流,以便正确保留标签,并且音频是 mp3 文件中的第一个流。我最终得到了这一行:

$nohup bash -c 'for f in */**/*.flac; do ffmpeg -i "${f}" -map 0:a -map 0:v:0? -map 0:v:1? -c:v copy -codec:a libmp3lame -qscale:a 2 -y "${f%.flac}.mp3"; done' 2>&1 > log.txt &

问号允许相关流丢失。 qscale 参数定义 ffmepg 中使用的 lame 编码器库的 mp3 编码质量。

相关内容