使用 audacity/lame/ffmpeg 进行 mp3 文件瘦身

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:使用 audacity/lame/ffmpeg 进行 mp3 文件瘦身
  • 本文链接:http://zengrong.net/post/2624.htm

注意:这是一篇非常基础的工具使用文章。

虽然已经迈入了 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 比特率曲线:

CBR/VBR/ABR 曲线对比

对于一般的非故事类手机游戏,我个人的建议是下面的值:

  • 背景音乐: 64kbps ABR 或 45~96kbps VBR,联合立体声。
    背景音乐一般比较长,文件也比较大,应该适当调低码率以降低文件大小。
  • 人声: 64kbps ABR 或 32~80kbps VBR,联合立体声。
    人声对高频音并不敏感。而且由于人耳对人声比较熟悉,可以比背景音乐的码率稍低。
  • 音效: 96 kbps ABR 或 60~128kbps VBR,联合立体声。
    音效文件长度都比较短,且对用户体验的影响较大。适当增加音效的码率会带来更好的游戏体验。

而故事类和音乐类游戏对音质的要求更高,不在本文讨论范围内。

GUI

瘦身不仅可以通过调整比特率实现。对于背景音乐,我们还可以通过找到音频中的循环部分,删除多余的部分来实现音频瘦身。这需要一个可视化的编辑工具。

Audacity 是一个跨平台的开源音频编辑软件,使用它可以很方便对音频文件进行编辑和转换。

先选择音频文件中要转换的部分,然后就可以进行转换:

Audacity 选择音频

导出选择的音频,选择 MP3 格式(注意Audacity的中文翻译和前置知识中的不太相同):

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 #0, mp3, from 'background_table.mp3':
  Metadata:
    encoder         : Lavf55.19.100
  Duration: 00:02:00.10, start: 0.046042, bitrate: 62 kb/s
    Stream #0:0: Audio: mp3, 24000 Hz, stereo, s16p, 62 kb/s
    Metadata:
      encoder         : LAME3.99r
    Side data:
      replaygain: track gain - -5.400000, track peak - unknown, album gain - unknown, album peak - unknown,

(全文完)