使用 audacity/lame/ffmpeg 进行 mp3 文件瘦身
注意:这是一篇非常基础的工具使用文章。
虽然已经迈入了 4G 时代,但由于各种各样的原因,国内的手机用户(主要是安卓用户)依然偏爱比较小的安装包。同样偏爱小安装包的还有国内各种安卓野鸡市场。因此,对于移动游戏开发者来说,掌握素材瘦身技能是必要的。本文主要介绍如何对 mp3 音频文件进行瘦身。
前置知识
为了避免使用专业术语导致不易理解,下面的指标描述均使用较为模糊的,为大众所接受的语言,同时直接给出结论,不会详细解释选择的原因。
音频文件有这样几个基础指标:
-
采样率
单位 KHZ(千赫兹),48/44.1 为 CD 音质;22.05/24 为语音音质;8/12/11.025 为电话音质。如果只是为了瘦身,不必关注这个值。在瘦身的过程中一般不需要重采样(resample)。 -
比特率
单位 kbit/s(aka kbps,千字位每秒),极限音质使用 320;较好音质使用 128;普通音质使用64。我们在互联网下载到的大多数 mp3 音乐都是 128 kbps。见下方网易云音乐截图。 -
CBR/VBR/ABR
固定比特率、可变比特率、平均比特率。它们的比特率曲线见下图。- Constant Bit Rate 固定比特率对音乐中的所有部分使用固定的比特率编码。对于手机游戏来说不建议选择。
- Variable Bit Rate 可变比特率通过对声音进行分析,对动态大的部分使用较大的比特率,否则采用较小的比特率。这种方式可以在音质类似的前提下降低文件大小。
- Average Bit Rate 每隔50帧对声音进行一次分析,在这50帧中采用 VBR 的编码方式。这是 LAME 发明的方法,是对 CBR 和 VBR 的折衷,理论上音质比 VBR 略好,文件大小和 VBR 相当。
-
Mono/Stereo/Joint Stereo
单声道、立体声和联合立体声。- 单声道音频使用单条音轨保存声音信息,左右耳听到的声音完全相同,保存的信息量比立体声少二分之一。虽然使用单声道可以让文件变得更小,但目前的手机都支持立体声,为了让用户得到更好的体验,除非音源就是单声道,否则建议使用立体声。
- 立体声使用两条音轨分别存储左耳和右耳听到的音频。
- 联合立体声会利用两条音轨中的相似的内容进行压缩,因此文件会比立体声小。许多encoder 在进行大码率压缩(>256)的时候,会自动把联合立体声替换成立体声。
网易云音乐选择在线播放音质的界面:
CBR/VBR/ABR 比特率曲线:
对于一般的非故事类手机游戏,我个人的建议是下面的值:
- 背景音乐: 64kbps ABR 或 45~96kbps VBR,联合立体声。
背景音乐一般比较长,文件也比较大,应该适当调低码率以降低文件大小。 - 人声: 64kbps ABR 或 32~80kbps VBR,联合立体声。
人声对高频音并不敏感。而且由于人耳对人声比较熟悉,可以比背景音乐的码率稍低。 - 音效: 96 kbps ABR 或 60~128kbps VBR,联合立体声。
音效文件长度都比较短,且对用户体验的影响较大。适当增加音效的码率会带来更好的游戏体验。
而故事类和音乐类游戏对音质的要求更高,不在本文讨论范围内。
GUI
瘦身不仅可以通过调整比特率实现。对于背景音乐,我们还可以通过找到音频中的循环部分,删除多余的部分来实现音频瘦身。这需要一个可视化的编辑工具。
Audacity 是一个跨平台的开源音频编辑软件,使用它可以很方便对音频文件进行编辑和转换。
先选择音频文件中要转换的部分,然后就可以进行转换:
导出选择的音频,选择 MP3 格式(注意Audacity的中文翻译和前置知识中的不太相同):
注意 Audacity 使用 LAME 作为 mp3 的编码器,而 LAME 在安装包中并没有默认提供,需要手动安装:How do I download and install the LAME MP3 encoder? 。
LAME
若有多达数十个音频文件需要转换,使用 GUI 就不方便了。我建议使用的工具是 LAME,我对 LAME 的评价如下:
LAME 是地球上最好的 mp3 编码器,没有之一。她凭借一己之力把 mp3 的渣音质提升到了精品级别。前面提到的 ABR 模式就是 LAME 发明的。虽然已经很久没有更新,但 LAME 在 mp3 音频编码器的地位上依然无码可以撼动。
看看如何使用 LAME 压缩一个 45~80kbps VBR 联合立体声的 mp3:
lame -m j -V 0 -q 0 -b 45 -B 80 {input_file} {output_file}
再来看看如何使用压缩一个 64kbps ABR 联合立体声的 mp3:
lame -m j --abr 64 {input_file} {output_file}
-m
参数指定 j 为联合立体声。如果不提供这个参数,lame 会默认按照码率来自动选择 (j)oint ,或者 (s)imple 。j 代表联合立体声,s 代表立体声。一般情况下,超过 256kbps 的码率会自动使用立体声。
更详细的说明请看这里: Usage LAME 。
我编写了一个简单的脚本 shrink.sh ,可以根据传递的文件路径自动创建子文件夹,用它配合 find 命令使用,就很容易进行批量转换了。
脚本用法
$ shrink.sh {input_file} {output_root_dir}
范例1,处理单个文件
瘦身 bgm/background_table.mp3
,另存为 shrink/bgm/background_table.mp3
。
$ shrink.sh current/bgm/background_table.mp3 shrink
范例2,批量处理
批量处理,对所有 bgm
文件夹下的 mp3 文件进行瘦身,目标文件夹是 shrink
,支持嵌套文件夹。
$ find bgm -name '*.mp3' -exec ./shrink.sh {} shrink \;
FFMPEG
用 Audacity 很容易实现导出音频文件的一部分。而是用 LAME 就无法做到。我们可以借助大名鼎鼎的 FFMPEG 来实现 mp3 无损分割。FFMPEG 是个全能型软件,对声音和视频的操作都不在话下。
无损剪切一段 mp3 文件的脚本是这样的:
$ ffmpeg -i {input_file} -t {time} -acodec copy {output_file}
ffmpeg 会自动根据扩展名 ‘.mp3’ 来自动判断你的文件格式进行处理。
其中 time 的值可以是下面这两种:
- 秒 例如:78.693
- 时:分:秒 例如: 0:25:33.108
我同样封装了一个简单的 cutmp3.sh 来简化输入。
脚本用法
$ cutmp3.sh {time} {input_file} {output_file}
范例
剪切 bgm/background_table.mp3
,从文件开头到 75.869 秒,生成 current/bgm/background_table2.mp3
:
$ cutmp3.sh 75.869 bgm/background_table.mp3 bgm/background_table2.mp3
查看码率
在转换 mp3 文件之前,应该先查看一下文件的比特率。如果原始的比特率很低,就没必要进行瘦身了。
可以使用 file 或者 ffmpeg 命令来查看音频文件信息:
$ file background_table.mp3
background_table.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v2, 64 kbps, 24 kHz, JntStereo
$ ffmpeg -i background_table.mp3
Input Metadata: encoder : Lavf55.19.100 Duration: 00:02:00.10, start: 0.046042, bitrate: 62 kb/s Stream Metadata: encoder : LAME3.99r Side data: replaygain: track gain - -5.400000, track peak - unknown, album gain - unknown, album peak - unknown,
(全文完)