最近几周,我已经从一种相当“动手”的 .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 编码质量。