在华为手表上听音乐吧——FLAC 到 MP3 带标签转换教程

  • ~3.73K 字
  1. 1. 转换音乐
  2. 2. 复制标签
  3. 3. 导入文件
  4. 4. 结语
  5. 5. 后记

华为手表支持通过手机同步音乐文件进行离线播放,而且支持 FLAC 格式。但是,你真的想在手表那么小的存储空间里放大量的 FLAC 文件吗……本文将教你如何将 FLAC 文件转换为 MP3,并保留原有的标签信息供「华为运动健康」App 使用。

FFmpeg 本身是支持转换标签的(利用 -map_metadata 选项,可自行问 LLM 了解),但它的标签支持并不是很好,会丢掉一些信息,比如封面图和歌词。给手表用是够了,但是如果要用于其他场景就不太合适了。同时,本文的主要目的是教学和记录,所以接下来会通过一个 Python 脚本来实现更完整的标签复制。

转换音乐

FFmpeg 走起。保存下面的脚本为 flac2mp3.sh,然后通过命令行运行它,传入源文件夹和目标文件夹作为参数即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

SOURCE_DIR="$1"
DEST_DIR="$2"

mkdir -p "$DEST_DIR"

for file in "$SOURCE_DIR"/*.flac; do
filename=$(basename -- "$file" .flac)
output_file="$DEST_DIR/$filename.mp3"
if [ -f "$output_file" ]; then
echo "跳过转换: $file -> $output_file(文件已存在)"
else
ffmpeg -i "$file" -b:a 320k "$output_file"
echo "转换完成: $file -> $output_file"
fi
done

echo "所有文件转换完成!"

上面的脚本会将指定文件夹中的所有 FLAC 文件转换为 320 kbps 的 MP3 文件。

复制标签

接下来,保存下面的 Python 脚本为 vorbis2id3.py,并确保你已经安装了 mutagen Python 库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import os
from mutagen.flac import FLAC
from mutagen.id3 import ID3, TIT2, TPE1, TALB, TPE2, TCOM, TDRC, TCON, TRCK, TPOS, COMM, USLT, APIC


def copy_vorbis_to_id3(flac_path, mp3_path):
flac_tags = FLAC(flac_path)
try:
audio = ID3(mp3_path)
except:
audio = ID3()
audio.delete()
tag_map = {
'title': TIT2,
'artist': TPE1,
'album': TALB,
'albumartist': TPE2,
'composer': TCOM,
'date': TDRC,
'genre': TCON,
'tracknumber': TRCK,
'discnumber': TPOS,
'comment': COMM,
}
for key, frame_class in tag_map.items():
if key in flac_tags:
value = flac_tags[key][0]
audio.add(frame_class(encoding=3, text=value))
if 'lyrics' in flac_tags:
lyrics_text = flac_tags['lyrics'][0]
audio.add(USLT(encoding=3, lang='eng', desc='Lyrics', text=lyrics_text))
if flac_tags.pictures:
flac_cover = flac_tags.pictures[0]
mime_type = flac_cover.mime
image_data = flac_cover.data
audio.add(
APIC(
encoding=3,
mime=mime_type,
type=3,
desc='Cover',
data=image_data
)
)
audio.save(mp3_path, v2_version=3)
print(f"Copied tags for {os.path.basename(flac_path)}")


def process_music_folders(flac_dir, mp3_dir):
if not os.path.exists(mp3_dir):
os.makedirs(mp3_dir)
for root, dirs, files in os.walk(flac_dir):
for flac_file in files:
if flac_file.endswith('.flac'):
flac_path = os.path.join(root, flac_file)
relative_path = os.path.relpath(flac_path, flac_dir)
mp3_file = os.path.splitext(os.path.basename(flac_file))[0] + '.mp3'
mp3_path = os.path.join(mp3_dir, os.path.dirname(relative_path), mp3_file)
mp3_sub_dir = os.path.dirname(mp3_path)
if not os.path.exists(mp3_sub_dir):
os.makedirs(mp3_sub_dir)
if os.path.exists(mp3_path):
print(f"Processing {flac_file}...")
copy_vorbis_to_id3(flac_path, mp3_path)


if __name__ == '__main__':
flac_folder = input("请输入 FLAC 文件夹路径: ").strip()
mp3_folder = input("请输入 MP3 输出文件夹路径: ").strip()
process_music_folders(flac_folder, mp3_folder)

哇,好多代码。都是 LLM 写的。

上面的脚本会递归地处理指定文件夹中的所有 FLAC 文件,并将它们的标签复制到对应的 MP3 文件中。

导入文件

自己复制到手机上导入,这个不用我说。

需要注意几点:

  1. 「华为运动健康」App 对于手机上标题重复的音乐文件会忽略掉某一个,机制不明……不要把打标签前后的文件都放在手机上。
  2. 「华为运动健康」App 对于「标题」标签里面有 - 的文件,无论有没有歌手信息,都会把它拆开当作标题和歌手,例如 太陽系デスコ-初音ミク「マジカルミライ 2020」Live- (feat. 初音ミク)……最好改一下。
  3. 代码里指定了 ID3 版本为 ID3v2.3。它的兼容性比较好,如果你导入其他地方的文件有问题,不妨试试把标签转换成 ID3v2.3。

结语

MP3 草案在 1991 年发布,直到 5 年后才有了 ID3v1。如果当时的人就能想到标签这回事,大概也没这么多事情吧。

后记

  1. 群友推荐用 Kid3 处理和转换 ID3 标签。
  2. 群友推荐用 qaac 处理 AAC 格式,比 MP3 更好。
分享这一刻
让朋友们也来瞅瞅!