有一次和做独立游戏的朋友聊到背景音乐,他问了我一个很有意思的问题:为什么有些游戏的关卡音乐,你打完很久之后还能哼出来,而有些游戏把所有关卡都用同一段音乐循环到底?答案并不只是“后者省钱”。到了《不可能的故事2》这种多关卡游戏里,1~11关的音乐能不能形成一条清晰的听觉曲线,往往直接决定了玩家对“关卡难度变化”的感知。
你回想一下自己玩过的关卡制游戏,很多让你印象深刻的关卡,并不是因为画面有多精致,而是因为音乐在恰到好处的时机出现。前几关节奏平稳,让你慢慢熟悉操作;中段开始加入不安的和声,暗示谜题变难;后段节奏加快,音量音色也跟着变紧,你的心跳似乎被BGM带着走。这种体验是设计出来的,不是随便找几首歌放进去就能实现的。
这篇文章不打算做“1~11关曲目逐个盘点”这种资料贴,因为具体的曲目信息应当以游戏官方发布为准,不同版本也可能有差异。我更想从技术角度拆解,玩家和开发者分别能从“关卡BGM”这件事里学到什么:
- 玩家视角:如何合法地收藏、整理、转换游戏背景音乐,如何解决音量不统一、循环不自然、格式不兼容等本地文件问题;
- 开发者视角:多关卡游戏的BGM应该怎么组织资源、怎么写播放逻辑、怎么做淡入淡出和资源加载优化,避免“一关一换歌”时出现明显的听觉断层。
无论你是单纯喜欢《不可能的故事2》的音乐,还是正在做自己的多关卡小游戏,这篇文章都值得收藏备用。
1. 为什么1~11关背景音乐会成为玩家关注的重点
对于一款带解谜元素的闯关游戏来说,背景音乐承担的任务比很多人想象中更重。它不仅仅是“背景”,而是关卡节奏的一部分。玩家在攻关时听不到自己的心跳,却能感受到BGM的节拍、音量、音色和情绪变化。这些变化会直接影响玩家的紧张程度,甚至影响操作判断。
《不可能的故事2》从第1关推进到第11关,正常情况下,关卡难度、谜题类型和场景主题都会发生变化。背景音乐最合理的做法,是跟着关卡内容同步调整。前期关卡音乐轻盈、稳定,给玩家建立安全感;中段关卡开始引入更多变奏和不确定性;后期关卡则需要更密集的节拍和更强的低频来制造压迫感。这套逻辑并不是某个游戏独有的,而是关卡制游戏通用的听觉设计思路。
从玩家反馈来看,总有人说“某一关的音乐一响起来,我就知道要进入状态了”。这句话听起来感性,背后其实是音频技术在做支撑:音乐循环点选得准,切换时没有爆音,音量和其他音效保持平衡,延迟时间足够低。这些指标任何一项没做好,玩家的沉浸感都会被打断。
所以,讨论“1~11关背景音乐”时,真正值得关注的点有三个:
- 音乐文件本身好不好听,这是耳朵决定的;
- 游戏引擎是怎么把音乐在正确的时机播放出来的,这是技术决定的;
- 玩家拿到本地音频文件后,怎么管理、转换、修复这些文件,这是工具和方法决定的。
这篇文章后两部分会重点展开,因为第1部分是主观感受,后两部分才是可以学习和复用的能力。
2. 游戏音频基础知识:BGM、音效、音频引擎与循环播放
2.1 什么是BGM,它和音效有什么区别
BGM 是 Background Music 的缩写,指背景音乐。它和 SFX(Sound Effect,音效)最大的区别在于:BGM是持续播放的,用于营造整体氛围;音效是短暂触发的,用于反馈具体行为,比如开门的吱呀声、拾取道具的提示音、按钮按下的点击声。
在游戏音频体系里,BGM和SFX是两条不同的管理线。BGM通常需要做循环、切换、淡入淡出;SFX则要求低延迟、短促、高并发。你可能同时听到十几把剑挥舞的音效,但通常不会同时听到三段完整的背景音乐。这个区别决定了它们在资源打包、内存加载和播放代码上的处理方式完全不同。
2.2 游戏音频的播放流程
从技术角度看,玩家听到的任何一段游戏音乐,都经历了这样一个流程:
- 资源加载:从安装包或更新包里读取音频文件;
- 解码:把压缩后的音频数据解码成PCM原始数据;
- 混音:把BGM、音效、语音等不同音源混合在一起;
- 输出:通过音频设备播放出来。
这里面最容易出问题的是第1步和第2步。如果音频资源被打包进了一个加密的容器文件里,改动或替换会很麻烦;如果解码方式不被当前设备支持,就会出现有声音没声、播放卡顿等情况。对于玩家来说,理解这个流程有助于排查“为什么这首BGM放在游戏里能播,拿出来就播不了”的问题。
2.3 循环播放与循环点(Loop Point)
游戏背景音乐和普通歌曲最大的不同,就是它经常需要“无缝循环”。普通歌曲在播放器里播完会停止,但游戏BGM必须首尾相接,让玩家听不出循环的界限。
实现无缝循环有两种常见方式:
- 音频文件本身就是为循环设计的,开头和结尾在声学上可以自然衔接;
- 播放器/游戏引擎支持设置循环点(loop point),播放到指定位置后跳回循环起点,而不是等整个文件播完。
很多游戏音频文件采用第二种方式,所以你在本地播放器里单独听一首游戏BGM时,可能听到结尾会突然停下,但在游戏里它却是无限循环的。这不是文件坏了,而是你缺少了那个循环逻辑。明白这一点,再去处理游戏BGM,就不会被“文件播放不完”的现象误导。
2.4 常见音频格式对比
处理游戏BGM时,会经常碰到下面几种格式:
| 格式 | 压缩方式 | 音质 | 体积 | 适用场景 |
|---|---|---|---|---|
| WAV | 无损无压缩 | 高 | 大 | 游戏音效、音频编辑源文件 |
| MP3 | 有损压缩 | 中高 | 较小 | 本地播放、通用播放器兼容 |
| OGG | 有损压缩 | 高 | 较小 | 游戏BGM常见格式,流媒体友好 |
| FLAC | 无损压缩 | 高 | 大 | 音质收藏、无损备份 |
| AAC | 有损压缩 | 高 | 小 | 视频平台、移动端兼容 |
做游戏音频处理时,建议保留一份WAV或FLAC格式的无损母版,日常播放和分享再转换成OGG或MP3。无损母版就像源工程文件,丢失了它,后续所有转码质量都会受影响。
3. 多关卡游戏里,背景音乐资源是怎么组织的
以《不可能的故事2》这种多关卡独立游戏为例,我们可以推演出大多数同类游戏中音频资源的大致组织方式。这里的重点是“通用规律”,因为具体游戏的内部结构不一定相同,但设计思路是可复用的。
3.1 音频目录结构
在多关卡游戏中,音频资源通常按“类型→关卡”的层级来组织。一个典型的目录结构长这样:
Assets/ ├── Audio/ │ ├── BGM/ │ │ ├── Level01_Intro.wav │ │ ├── Level01_Battle.wav │ │ ├── Level02_Quiet.wav │ │ └── ... │ └── SFX/ │ ├── jump.wav │ ├── switch_button.wav │ └── puzzle_success.wav这样做的好处是:
- 不同模块的音频互不干扰;
- 按关卡名/场景名命名,程序员写代码时能一眼找到对应资源;
- 资源打包时可以按目录批量处理,比如“这组文件只随关卡2加载”。
给玩家的启发是:如果你从官方渠道获得了游戏OST或音频文件,也建议按照“类型→关卡号”的方式重新组织本地文件夹,后续查找会非常方便。
3.2 资源打包与加密
大多数游戏不会把所有音频文件裸放在安装目录里,而是会打包成专用格式,或放在统一的资源包里。常见做法包括:
- 直接使用文件夹+文件的方式,适合轻量级游戏;
- 打包成自定义容器格式;
- 使用 Unity AssetBundle、Unreal Pak 等引擎资源系统统一管理。
如果音频文件被放进了加密容器,玩家是不能直接提取的。此时应该优先寻找官方发布的OST,而不是尝试破解或逆向。这一点后面还会单独强调。
3.3 加载策略:随用随载还是常驻内存
一款游戏有11关,每关都有独立的BGM,如果游戏一启动就把所有BGM全部加载进内存,会造成不必要的资源浪费。成熟的游戏音频系统通常会采用“按需加载”策略:
- 进入关卡前,预加载本关需要的BGM;
- 切换关卡时,释放上一关的BGM资源;
- 常驻内存的只有全局菜单音乐和少量UI音效。
对开发者来说,这个策略能显著降低内存峰值和启动时间。对玩家来说,思考这个问题可以帮助理解“为什么在某些关卡的加载界面,音乐会出现一小段空白或重复”——很可能就是资源加载和释放在切换时产生了空隙。
3.4 资源命名的工程意义
你可能觉得“BGM_Level_10_v2_final_final.mp3”这种名字很业余,但在真实项目里确实存在。规范命名不只是为了好看,更是为了减少音频调试成本。建议的命名规则是:
类型_场景/关卡_用途_版本.扩展名 BGM_Level01_Intro_v1.wav开发团队在排错时,能通过文件名快速定位资源;版本号避免“改完一遍忘备份”的尴尬。作为普通玩家,整理本地音乐时也可以沿用这种思路,避免把自己绕晕。
4. 玩家如何合法地收藏和整理游戏背景音乐
很多玩家喜欢游戏里的BGM,想把它收藏到手机或电脑里慢慢听。这里需要先立一个原则:支持正版,不要破解提取。
4.1 官方OST是最稳妥的获取方式
如果你喜欢《不可能的故事2》的1~11关背景音乐,最规范的做法是查看游戏是否发售了官方原声带。很多独立游戏会以数字专辑的形式在音乐平台上线,或者随游戏本体提供音轨解锁内容。官方OST的音质通常比游戏内提取版更好,因为它可能是直接从无损母带转制的。
搜索“游戏名 + OST / Original Soundtrack”可以快速判断是否有官方作品。如果官方没有发布OST,耐心等待或向开发者反馈是更合适的方式,而不是自己去破解游戏包。
4.2 个人备份和整理的边界
如果你是正版玩家,想给自己听过的BGM做一个备份,技术上可以录制或转码,但这里存在明确的版权边界。简单来说:
- 个人学习和欣赏,可以保留样本,但要控制在不侵犯他人权益的范围内;
- 不能公开发布、传播未经授权的音频文件;
- 不能将提取的音频用于自己开发游戏的商业项目。
文章的代码和操作方法,主要用于处理你已经拥有合法来源的音频文件,比如官方OST、授权音效素材,以及你自己创作的音频。这一点请务必牢记。
4.3 本地音乐管理工具推荐
整理BGM时,以下几类工具覆盖面足够:
- 批量格式转换:FFmpeg;
- 批量重命名:Python脚本、PowerShell脚本、批量改名工具;
- 音频信息查看:FFprobe(FFmpeg自带)、Mp3tag;
- 响度标准化:FFmpeg的 loudnorm 滤镜;
- 播放列表生成:文本编辑器或播放器自带导出功能。
接下来第5章会用实际命令演示这些工具的具体用法。
5. 背景音乐处理实操:格式转换、响度归一化与循环管理
这一章是全文最实操的部分。我会用一套完整命令,带你走完“查看音频信息→格式转换→音量/响度统一→批量整理→生成播放列表”的流程。
5.1 查看音频文件的详细信息
拿到一个BGM文件,先别急着转换,先用 FFprobe 看看它的格式、编码、采样率、码率等信息。
ffprobe -show_format -show_streams bgm_level_01.ogg输出内容较多时,可以只提取关键字段:
ffprobe -v quiet -show_entries stream=codec_name,sample_rate,channels,bit_rate -of default=noprint_wrappers=1 bgm_level_01.ogg典型输出:
codec_name=vorbis sample_rate=44100 channels=2 bit_rate=128000这条命令的意义在于,帮你判断这个音频文件是否适合当前播放器。如果文件是少见编码格式,播放器不支持,再考虑转码。
5.2 使用 FFmpeg 做格式转换
游戏BGM常见格式是OGG,但有些便携播放器或剪辑软件对OGG支持不好。这时可以转成MP3或高质量AAC。
转换为MP3:
ffmpeg -i bgm_level_01.ogg -c:a libmp3lame -q:a 2 bgm_level_01.mp3其中-q:a 2是VBR质量参数,2表示高质量,体积适中。
转换为OGG(Vorbis):
ffmpeg -i bgm_level_01.mp3 -c:a libvorbis -q:a 5 bgm_level_01.ogg转换为FLAC(无损备份):
ffmpeg -i bgm_level_01.mp3 -c:a flac bgm_level_01.flac批量转换整个目录时,可以写一个简单的shell循环:
mkdir -p output_mp3 for file in *.ogg; do ffmpeg -i "$file" -c:a libmp3lame -q:a 2 "output_mp3/${file%.ogg}.mp3" done这里真正容易踩坑的地方是:批量转码时如果源文件和目标文件放在同一目录,可能因为同名覆盖导致文件损坏。建议一律输出到独立目录。
5.3 响度标准化,让每关BGM音量一致
不同关卡的音乐来自不同曲目,录音混音时的响度可能不一样。你听第1关时音量正常,到第5关突然变响,体验会很差。这时可以使用 FFmpeg 的 loudnorm 滤镜做响度一致化处理。
ffmpeg -i bgm_level_01.mp3 -af loudnorm=I=-16:TP=-1.5:LRA=11 bgm_level_01_norm.mp3参数含义:
I:目标整体响度,单位 LUFS,一般音乐取 -16 到 -14;TP:真实峰值上限,取 -1.5 到 -1.0 dBTP 可以防止爆音;LRA:响度范围,值越大动态越大,取11比较平衡。
如果只想检测当前音频的响度而不想生成新文件,可以用:
ffmpeg -i bgm_level_01.mp3 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -f null -它会输出一串JSON,其中input_i是输入音频的感知响度,input_tp是真实峰值。这个数据能帮你判断哪些文件音量明显偏大或偏小。
注意:响度标准化会改变音频动态范围,如果你很在意原始混音效果,建议只对音量偏差特别明显的文件做处理,或者始终保留一份原始无损文件。
5.4 批量重命名音频文件
整理1~11关的音乐,最需要批量重命名。用 Python 写一个简单脚本,把源目录里的音频按顺序复制到目标目录,并统一命名为level_01.mp3、level_02.mp3这种格式。
# 文件路径:rename_bgm.py import shutil from pathlib import Path SOURCE_DIR = Path("./source_bgm") # 源目录,存放未整理的音频 TARGET_DIR = Path("./bgm_sorted") # 目标目录,存放整理后的音频 TARGET_DIR.mkdir(exist_ok=True) # 只处理 .ogg 文件,其他格式按需修改后缀 audio_files = sorted(SOURCE_DIR.glob("*.ogg")) if not audio_files: print("未找到任何 .ogg 文件,请检查源目录") exit(1) for index, file_path in enumerate(audio_files, start=1): new_name = f"level_{index:02d}{file_path.suffix}" target = TARGET_DIR / new_name shutil.copy2(file_path, target) print(f"已复制: {file_path.name} -> {new_name}")运行方式:
python rename_bgm.py这里更推荐copy2而不是rename,因为复制不会破坏源文件。万一目标文件顺序错了,你还能从原始文件重新整理。如果源文件名本身能看出关卡号,建议在脚本里补充解析逻辑,避免“按字母排序”导致关卡顺序错乱。
5.5 生成播放列表
整理好之后,如果要导入手机或播放器,一个.m3u播放列表会非常方便:
find ./bgm_sorted -name "*.mp3" | sort > bgm_playlist.m3uWindows PowerShell 下可以改用:
Get-ChildItem ./bgm_sorted -Filter *.mp3 | Sort-Object Name | ForEach-Object { $_.FullName } | Out-File bgm_playlist.m3u -Encoding UTF8这样生成的播放列表,按顺序就是第1关到第11关的音乐。
5.6 循环处理的注意事项
前面提到,游戏内部BGM是无缝循环的,但单独拿出音频文件后,播放器默认是“播完就停”。如果你希望本地听感接近游戏内循环,可以:
- 在支持A-B重复的播放器里手动设置循环段落;
- 使用音频剪辑软件裁剪首尾,让结尾自然过渡到开头;
- 使用 Mp3tag 这类工具给FLAC/MP3文件写入循环点元数据(如果播放器支持)。
千万不要把同一首歌复制十几遍拼成一个长文件来实现循环,这样文件体积会成倍增大,播放时还可能听到拼接点,非常不专业。
6. 独立游戏开发者视角:多关卡BGM的程序实现
如果你正在做自己的多关卡游戏,或者想仿照《不可能的故事2》的音频设计来做练手项目,这一章的代码可以直接复用。
6.1 先想清楚音乐切换需求
多关卡BGM切换通常有几种情况:
- 进入新关卡,替换当前BGM;
- 同一关内不同区域切换BGM;
- 战斗/解谜状态切换时,BGM从常速版本切到紧张版本。
最简单的情况是“每关一首BGM”。这种需求一个 AudioSource 就够。稍微复杂一点的是“交叉淡化”切换,也就是旧BGM淡出、新BGM淡入,避免切换生硬。
6.2 Unity 示例:单个AudioSource播放每关BGM
下面用 Unity 官方 API 写一个最简版本。脚本挂在场景中的空物体上,外部调用PlayLevelBgm(关卡索引)即可播放指定关卡的音乐。
// 文件路径:Assets/Scripts/LevelBgmManager.cs using UnityEngine; public class LevelBgmManager : MonoBehaviour { [Header("按关卡顺序拖入BGM音频资源")] public AudioClip[] levelBgmClips; private AudioSource bgmSource; private void Awake() { bgmSource = gameObject.AddComponent<AudioSource>(); bgmSource.loop = true; bgmSource.playOnAwake = false; } public void PlayLevelBgm(int levelIndex) { if (levelBgmClips == null || levelBgmClips.Length == 0) { Debug.LogWarning("尚未配置任何关卡BGM"); return; } if (levelIndex < 0 || levelIndex >= levelBgmClips.Length) { Debug.LogWarning($"关卡索引 {levelIndex} 越界,无法播放BGM"); return; } // 如果当前已经播放这首BGM,就不必重新触发 if (bgmSource.clip == levelBgmClips[levelIndex] && bgmSource.isPlaying) { return; } bgmSource.Stop(); bgmSource.clip = levelBgmClips[levelIndex]; bgmSource.Play(); } }逻辑很简单,但要注意边界判断:数组为空的防御、索引越界的防御,都要写。真实项目里,越界往往是配置表填错了,不是程序逻辑错了。完善的日志能帮你更快定位问题。
6.3 Unity 示例:带交叉淡入淡出的BGM切换
直接切换BGM在大多数场景会显得生硬,尤其是一首舒缓曲突然变成紧张曲。更稳妥的方案是交叉淡化。以下代码演示了单AudioSource下如何实现淡出旧曲、淡入新曲的效果。
// 文件路径:Assets/Scripts/BgmCrossfadeManager.cs using System.Collections; using UnityEngine; public class BgmCrossfadeManager : MonoBehaviour { [Header("按关卡顺序拖入BGM音频资源")] public AudioClip[] levelBgmClips; [Header("淡入淡出时长(秒)")] public float fadeDuration = 1.0f; private AudioSource bgmSource; private void Awake() { bgmSource = gameObject.AddComponent<AudioSource>(); bgmSource.loop = true; bgmSource.playOnAwake = false; } public void PlayLevelBgm(int levelIndex) { if (levelBgmClips == null || levelBgmClips.Length == 0) { Debug.LogWarning("尚未配置任何关卡BGM"); return; } if (levelIndex < 0 || levelIndex >= levelBgmClips.Length) { Debug.LogWarning($"关卡索引 {levelIndex} 越界,无法播放BGM"); return; } StopAllCoroutines(); StartCoroutine(SwitchClip(bgmSource, levelBgmClips[levelIndex])); } private IEnumerator SwitchClip(AudioSource source, AudioClip newClip) { if (source.clip == newClip) { yield break; } float startVolume = source.volume; // 淡出旧音乐 while (source.volume > 0f) { source.volume -= startVolume * Time.deltaTime / fadeDuration; yield return null; } source.Stop(); source.clip = newClip; source.volume = 0f; source.Play(); // 淡入新音乐 while (source.volume < startVolume) { source.volume += startVolume * Time.deltaTime / fadeDuration; yield return null; } source.volume = startVolume; } }这个方案的缺点是无法同时播放两段音乐,淡出旧的瞬间其实旧曲已经停了。要做到严格意义上的“交叉重叠淡化”,需要用两个AudioSource,让旧曲在新的淡入期间继续播放。真实项目中更推荐双AudioSource方案,但单AudioSource方案作为入门理解足够了。
6.4 资源加载优化建议
一个常见误区是把11关的BGM全部拖进Inspector,让它们在场景加载时全部驻留内存。对于小型独立游戏,11段BGM可能不算大,但在大项目中,这种行为会拖慢加载速度并提高内存峰值。
更好的做法包括:
- 使用 Unity Addressable Assets 或 Resource 按关卡加载;
- 关卡切换时卸载上一关的BGM;
- 对超长BGM做流式加载,而不是全量解码到内存。
先明确一点:优化要基于真实数据,不要凭空猜测。先用Profiler看内存占用,如果BGM总共只占10MB,那就不值得为了优化它而引入复杂的资源管理框架。把时间花在实际瓶颈上。
7. 常见问题与排查方法
玩家和开发者在处理游戏BGM时,经常会遇到下面这些情况。我把它们整理成一张排查表。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 本地播放BGM,播完直接停止 | 播放器未开启循环,或文件缺少循环标记 | 检查播放器循环设置;用ffprobe查看文件信息 | 在播放器中开启循环,或使用支持A-B重复的工具 |
| 不同关卡BGM音量差异明显 | 原始文件响度不一致 | 用ffmpeg loudnorm检测各文件input_i | 对所有文件统一做响度标准化 |
| BGM切换时有爆音或咔哒声 | 切换前没有淡出,且音量不为0 | 检查代码中AudioSource.volume和Stop时机 | 使用交叉淡化方案,确保Stop前音量已接近0 |
| 某些音频文件播放器不支持 | 编码格式或扩展名不匹配 | ffprobe查看编码器信息,确认实际编码 | 转码为通用格式,如MP3或AAC |
| 游戏启动后内存占用过高 | 所有BGM被一次性加载 | 用Profiler检查音频资源内存 | 改为按需加载,关卡切换时释放上一关资源 |
| 批量转码后文件名乱序 | 按字母排序导致1、10、11排在2前面 | 检查源文件命名,是否缺少前导零 | 统一命名成 level_01、level_02 格式 |
| 提取的音频文件在游戏里可播,本地不能播 | 游戏引擎支持特殊封装格式,播放器不支持 | 判断文件是否为游戏自定义包装 | 优先使用官方OST;不要逆向破解 |
常见问题中,最容易被忽视的是命名排序。你可能觉得level_10.mp3排在level_2.mp3前面没什么,但在播放器里按文件名播放时,顺序确实会乱。解决方案很简单:关卡号不足两位时补零,从level_01命名到level_11。
开发者在排查BGM切换问题时,建议先打开音频系统的Debug日志,记录每次切换的关卡索引、歌曲名称和时间点。很多时候问题不是出在音频系统本身,而是关卡配置事件触发太早或太晚,比如刚进关卡就播放了BGM,结果与场景淡入重叠,造成混乱。
8. 最佳实践与版权安全提醒
8.1 玩家侧的最佳实践
- 优先收藏无损格式:WAV或FLAC作为原始备份,MP3/OGG作为日常播放版本;
- 统一命名规则:关卡号补零,比如
level_01、level_02,避免排序混乱; - 保留源文件:批量转换、重命名前,先复制一份原始目录,以便出错恢复;
- 记录来源信息:在文件夹里放一个
README.txt,写清楚音频来自哪个游戏、哪个官方渠道、购买日期; - 不要公开发布提取音频:喜欢可以分享链接引导大家购买官方OST,而不是直接发资源包。
8.2 开发者侧的最佳实践
- 从项目第一天就建立Audio资源目录规范,避免后续文件越堆越乱;
- 命名包含“类型_关卡/场景_用途_版本”,例如
BGM_Level01_Intro_v1.wav; - 所有音频在导入引擎前先统一响度,不要在引擎里逐个AudioSource调音量;
- 切换BGM必须考虑淡入淡出,这是最小成本提升音乐体验的手段;
- 写防御判断:数组越界、空引用、重复播放都要有日志,排错时会感谢自己;
- 用Profiler数据说话,不要过度优化小节BGM的内存占用。
8.3 关于版权,必须说清楚的底线
游戏音乐和游戏代码一样,是受版权保护的智力成果。未经授权把游戏音频提取出来、二次上传到平台、打包售卖,都属于侵权行为。即使版权方没有立刻发现,也不代表行为是对的。真正喜欢一款游戏音乐,最值得做的事是让开发者获得回报:购买游戏、购买OST、在平台支持开发者。只有在这样的前提下,你做的格式转换、响度调整、本地整理才算是合法的个人使用。
回到《不可能的故事2》的1~11关背景音乐,当你解决了音量不统一、循环不自然、格式不兼容的问题之后,再戴上耳机从头听到尾,你会比任何时候都更清楚,这段听觉旅程里面包含着多少设计和工程成本。
建议把这篇文章收藏备用。下次你再遇到游戏BGM播放问题,或者想为自己的项目添加多关卡音乐,直接照着命令和代码操作就好了。