将 FLAC 转换为 MP3

出自 ArchWiki

本文概述了从 FLAC 转码为 MP3 的不同方法。FLAC 是一种无损音频格式,因此更适合存档目的,但也占用更多磁盘空间。其目的是压缩文件,而不会造成可感知的保真度损失。

软件包

  • audiotoolsAUR - 在不同格式之间转码并使用 track2track 保留标签,可以使用 cdda2track 从 CDDA 编码,具有可选的 Ncurses GUI。
  • flac2allAUR - 将 flac 多线程转换为 70 多种其他格式,保留所有标签和元数据。
  • whatmp3AUR - 一个小型 Python 脚本,它接受包含 FLAC 文件的目录列表作为参数,并将它们转换为具有指定选项的 MP3。

图形化应用程序

  • SoundConverter — 一个专用的音频转码实用程序,为 GNOME 桌面构建,并依赖于 GStreamer。它可以利用 GNOME 音频配置文件,并具有多线程转换功能。它还可以从视频中提取音频。
https://soundconverter.org/ || soundconverter
  • soundKonverter — 一个 Qt 图形前端,用于各种音频处理程序。具有转换、抓取和其他音频处理功能。
https://github.com/HessiJames/soundkonverter/wiki || soundkonverterAUR
  • WinFF — 强大的多媒体转换器 FFmpeg 的 GUI。具有用于音频转码的专用配置文件。
https://github.com/WinFF/winff/ || winff-gtk3AUR, winff-qt6AUR

脚本

在这两个示例中,当前目录中的 FLAC 文件由 LAME MP3 编码器编码。这两个脚本都将 ID3 标签从 FLAC 文件传递到生成的 MP3 文件,并编码为 MP3 V0。V0 会产生通常在 220-260 kbps 之间的可变比特率。V0 文件的音频是透明的,这意味着人们无法分辨有损文件和原始源(光盘/无损)之间的区别,但文件大小却显着减小。有关 LAME 开关/设置(例如 V0)的更多信息,请访问 Hydrogenaudio LAME Wiki

原始的 .flac 文件不会被修改,生成的 .mp3 文件将位于同一目录中。工作目录中扩展名与 *.flac 不匹配的所有文件(.nfo、图像、.sfv 等)都将被忽略。

用法

为了方便使用,请将脚本添加到您的 PATH 中。打开终端,cd 到您希望转换的 FLAC 文件目录,然后调用 flac2mp3(或您为脚本命名的任何名称)。您将在终端中看到详细的解码/编码过程,这可能需要一些时间。完成!此时,您可以轻松地 mv *.mp3 将所有新的 MP3 移动到您希望的任何位置。

使用 FFmpeg

您的系统很可能已经安装了 FFmpeg,它带来了 flaclame 软件包。FFmpeg 具有内置的所有编码和解码工具来完成这项工作。

#!/bin/bash

for a in ./*.flac; do
  < /dev/null ffmpeg -i "$a" -qscale:a 0 "${a[@]/%flac/mp3}"
done

并行版本

由于 LAME 是单线程编码器,因此可以通过在多个核心上同时编码多个文件来加速转换。为此,安装 parallel 软件包,然后运行

parallel ffmpeg -i {} -qscale:a 0 {.}.mp3 ::: ./*.flac

并行递归版本

Fd 是 find 的快速、用户友好的替代方案。这个单行命令避免了 “while read” 循环,根据 Stack Exchange 上的回复,这可能会对性能产生影响。 [1]

安装 fd,然后运行

fd -t f -e flac -x ffmpeg -i "{}" -qscale:a 0 "{.}.mp3"

用于增量递归转码的 Makefile

警告: Makefile 不正确处理空格,有关详细信息,请参见 [2]

除了使用 make -j$(nproc) 并行转码外,这还具有不重新生成后续执行中已存在的转码文件的额外好处

SOURCE_DIR := flacdir
XCODE_MP3_DIR := mp3dir
# NOTE: see lame -v option for quality meaning
XCODE_MP3_QUALITY := 0

# Find .flac sources and determine corresponding targets
flac_srcs := $(shell find $(SOURCE_DIR) -type f -name '*.flac')
flac_2_mp3_tgts := $(patsubst $(SOURCE_DIR)/%.flac, $(XCODE_MP3_DIR)/%.mp3, \
    $(flac_srcs))

.PHONY: all mp3 flac_2_mp3

all: mp3 

mp3: flac_2_mp3

flac_2_mp3: $(flac_2_mp3_tgts)

$(XCODE_MP3_DIR)/%.mp3: $(SOURCE_DIR)/%.flac
        @echo "converting -> $@"
        @mkdir -p "$(@D)"
        @ffmpeg -v error -i "$<" -codec:a libmp3lame \
            -q:a $(XCODE_MP3_QUALITY) "$(@)"

不使用 FFmpeg

如果由于某种原因未安装 FFmpeg 并且您不想安装它,您仍然需要安装 flaclame。在这里,标记过程更加明确,使用了 flac 附带的元数据实用程序,并将信息传递给 lame。由于 FLAC 必须首先解码为 WAVE,然后馈入 MP3 编码器,因此处理时间将略有增加。

#!/bin/bash

for a in ./*.flac; do
  # give output correct extension
  OUTF="${a[@]/%flac/mp3}"

  # get the tags
  ARTIST=$(metaflac "$a" --show-tag=ARTIST | sed s/.*=//g)
  TITLE=$(metaflac "$a" --show-tag=TITLE | sed s/.*=//g)
  ALBUM=$(metaflac "$a" --show-tag=ALBUM | sed s/.*=//g)
  GENRE=$(metaflac "$a" --show-tag=GENRE | sed s/.*=//g)
  TRACKNUMBER=$(metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g)
  DATE=$(metaflac "$a" --show-tag=DATE | sed s/.*=//g)

  # stream flac into the lame encoder
  flac -c -d "$a" | lame -V0 --add-id3v2 --pad-id3v2 --ignore-tag-errors \
    --ta "$ARTIST" --tt "$TITLE" --tl "$ALBUM"  --tg "${GENRE:-12}" \
    --tn "${TRACKNUMBER:-0}" --ty "$DATE" - "$OUTF"
done

递归地

上述脚本的一个有用的扩展是让它们递归到工作目录的所有子目录中。为此,请将第一行(for .... do)替换为

find -type f -name "*.flac" -print0 | while read -d $'\0' a; do

参见