制作一段音游谱面后,从可玩状态到对外展示,中间隔着一条非常实际的工程链路:谱面数据要能被播放器或模拟器解析,画面要跟音乐严格对齐,难度标记要让观众一眼理解,发布前还要反复验证“看起来准”而不是“看起来差不多”。Cryogenic FBD12这种谱面预览在音游社区里很常见,它的难点通常不是打谱本身,而是把一张节奏密集、物件复杂的谱面,在视频里完整、准确、有感染力地呈现出来。
这篇文章会以一张名为Cryogenic的曲目、难度标记为FBD12的谱面预览为例,拆解从谱面文件到预览视频的完整制作流程。内容包括项目目录怎样搭、音频节奏参数如何登记、谱面 JSON 如何解析成时间轴事件表、剪辑软件里如何放置素材、如何用逐帧和波形核对同步、以及发布前最容易被忽略的质量检查项。即使你没有接触过音游谱面编辑器,只要按这条链路走一遍,也能做出结构完整的谱面预览。
需要说明的是,FBD12如果按标题字面理解,更像一组谱面难度标识或内部标注,不一定来自游戏官方字段。实际制作时,以谱面编辑器导出数据和游戏内显示为准,这篇文章使用它只是为了区分谱面文件的版本和难度档位。
1. 先理解谱面预览这条工程链路
1.1 谱面预览到底是什么:从可玩文件到可传播画面
谱面预览不是“录一段游戏”那么简单。很多音游谱面在编辑器里可以正常试玩,但录出来的视频会出现两类问题:一类是画面完全没有踩在音乐节拍上,物件起落和鼓点错位,观众一眼就能看出“手感不对”;另一类是视频里缺少难度信息、键位说明、判定表现等内容,路人无法判断这张谱面哪里难、难在什么类型。
所以谱面预览的本质可以拆成三层:
- 第一层是谱面数据层:包含下落轨道、物件类型、时间点、时长、移动路径等信息。
- 第二层是画面表现层:把 Note、判定线、轨道运动转换成一帧帧连续画面,并搭配合适转场。
- 第三层是信息传播层:让观众知道曲名、难度、作者、速度档位、BPM 和谱面核心看点。
对Cryogenic FBD12这种预览,第一层最容易从编辑器得到,第二层需要剪辑与渲染,第三层容易在后期被忽略。真正拉开作品差距的,往往是第二层和第三层的完成度。
1.2 为什么 FBD12 这类谱面会卡在“对准节拍”而不是“画面对齐”
音游谱面的节奏基准与普通视频剪辑的节奏基准不完全一样。视频剪辑只需要对到音频波形的强拍即可,但谱面必须对到游戏谱面系统内部的时间戳。谱面里每一个 Note 都带一个绝对时间,单位通常是毫秒或秒。当视频只按波形主观对齐时,如果谱面自身带了一个offset(歌曲起始点偏移),哪怕音频没有变化,Note 的位置也会整体前移或后移。
FBD12如果代表 12 级难度,通常意味着 Note 密度较高,可能出现长条、多押、快速纵连或变速。密度越高,观众对节奏偏差越敏感。12级谱面里一个 16 分音在 175 BPM 下只有约 85 毫秒间隔,如果视频偏移 30 毫秒,普通观看可能觉得“有点别扭”,但熟悉该难度层的玩家会直接判定为糊键或空拍。因此节奏对齐必须做到毫秒级。
1.3 一个完整的预览视频从哪里开始到哪里结束
制作一版谱面预览,推荐按下面这条链路推进:
- 整理原始素材:完整音频、谱面文件、封面图、难度标签。
- 用工具提取音频 BPM、offset、采样率等基础参数。
- 把谱面文件解析成人类可读的事件表,确认 Note 总数、时间范围、特殊事件类型。
- 在剪辑软件或渲染引擎里建立时间线,把谱面的绝对时间映射到视频时间。
- 加入轨道动画、判定文字、节拍提示等内容。
- 导出成片,用逐帧和波形做同步验收。
- 处理版权、平台规格、发布标题等信息后放出。
这篇文章会把每一步落到具体操作,并给出可继续扩展的思路。
2. 素材准备与时间轴基准
2.1 素材清单与项目目录
先整理文件。没有清晰目录,制作到一半经常找不到音频版本或谱面版本。下面这个结构适合单曲谱面预览项目:
cryogenic_fbd12_preview/ ├─ audio/ │ ├─ cryogenic_source.wav # 原始音频,最好是完整无压缩或高质量 lossless │ └─ cryogenic_preview_mix.wav # 直接用于成片混音的音频轨 ├─ chart/ │ ├─ cryogenic_fbd12.json # 谱面数据,编辑器导出或转换得到 │ └─ cryogenic_fbd12.csv # 由脚本生成的可读事件表 ├─ asset/ │ ├─ cover.png # 曲目封面或谱面缩略图 │ ├─ bgm_wave.png # 剪辑时看的波形参考 │ └─ note_scale.png # 键型标注图 ├─ scripts/ │ ├─ parse_chart.py # 解析谱面并输出事件表 │ └─ export_sections.py # 按段落导出时间轴分段 ├─ project/ │ ├─ edit_project.prproj # 剪辑工程文件 │ └─ render.toml # 导出参数配置 └─ export/ └─ cryogenic_fbd12_preview_v01.mp4目录本身不复杂,但要把音频和谱面分离。后续如果作者修改了谱面难度,只需要替换chart目录并重新生成事件表;如果修改了音频混音,只需要替换audio目录并重新渲染波形参考。把源头文件、中间产物和最终导出分离,是后期不出混乱的基础。
2.2 音频 BPM、offset、采样率怎么登记
谱面预览最怕的是只记了 BPM,没记 offset。BPM 决定了每分钟拍数,但 BPM 相同并不代表第一个强拍一定落在音频的 0 毫秒。很多曲库的音频从曲目开始处直接截取,而谱面编辑器为了对齐歌曲起始静音,可能设置了-120ms的 offset。如果剪辑时用音频 0 点当作第 1 拍,整体就会偏 120 毫秒。
建议先准备一份节奏参数登记表。可以用ffprobe查看音频基础信息:
ffprobe -v quiet -print_format json -show_format -show_streams audio/cryogenic_source.wav输出里重点确认sample_rate、duration、channels和codec_name。然后打开 Audacity 或类似工具,观察音频波形前几个最强峰的位置,结合谱面编辑器里的 BPM 值,估算 offset。
参数登记表可以按下面格式记录:
| 参数 | 含义 | 示例值 | 配合检查 |
|---|---|---|---|
| title | 曲名 | Cryogenic | 与谱面元数据一致 |
| artist | 曲师 | 以实际曲目为准 | 用于发布文案 |
| bpm | 每分钟拍数 | 175 | 控制网格密度 |
| offset_ms | 歌曲起点相对时间轴偏移 | -120 | 决定首个 Note 位置 |
| sample_rate | 音频采样率 | 48000 Hz | 避免与剪辑工程不一致 |
| audio_fade_ms | 结尾淡出时间 | 800 ms | 防止歌曲结束突兀 |
| first_note_ms | 谱面第一个 Note 时间 | 1425 ms | 验证整体对齐 |
| last_note_ms | 谱面最后一个 Note 时间 | 108320 ms | 决定视频总时长 |
如果原始材料没有明确给出 BPM 和 offset,不要猜,要先打开音频工具实际测量,或者重新从谱面文件的元数据里读取。offset调错是谱面预览最隐蔽的错误来源。
2.3 谱面文件格式:从编辑器导出到通用 JSON
不同音游编辑器导出的谱面格式不同。有些是专门的二进制格式,有些是 JSON,有些是带扩展名的文本格式。做成视频预览,不需要理解所有底层字段,但至少要把这些关键字段找出来:Note 出现时间、轨道编号、Note 类型、长条持续时间、移动路径事件。
假设谱面导出成了 JSON,常见结构可能是这样:
{ "meta": { "title": "Cryogenic", "artist": "unknown", "bpm": 175, "offset_ms": -120, "level": "FBD12", "tracks": 4 }, "timing": [ { "type": "bpm_change", "time_ms": 0, "bpm": 175 } ], "notes": [ { "id": 1, "time_ms": 1425, "track": 1, "type": "tap", "duration_ms": 0 }, { "id": 42, "time_ms": 9150, "track": 3, "type": "hold", "duration_ms": 480 } ], "camera": [ { "time_ms": 2000, "position": [0, 5, 12], "rotate": [0, 0, 0] } ] }实际字段名以编辑器文档为准。这里展示的是通用思路:time_ms表示物体出现时间,duration_ms表示长条持有时间,track表示轨道路径编号。解析这些字段之前,先检查文件编码是否 UTF-8,是否带 BOM,避免脚本读出来中文或特殊字符乱码。
注意:不要把谱面改成编辑器不认识的字段名再重新导回游戏。预览视频使用的 JSON 是中间产物,游戏可播放版本仍应使用编辑器原生格式或被官方认可的格式,否则会出现“预览视频正常,游戏内无法读取”的问题。
3. 用脚本把谱面解析成可同步的事件表
3.1 解析脚本要完成的工作
拿到谱面 JSON 后,如果在剪辑软件里一条一条人工找 Note,效率很低。先用脚本把谱面解析成事件表,可以减少大量来回拖动时间线的工作。
脚本需要完成这些目标:
- 读取元数据,输出 BPM、offset、轨道数和 Note 总数。
- 把所有 Note 按
time_ms升序排列。 - 根据 BPM 和拍号,计算每个 Note 落在第几小节第几拍。
- 生成一段 CSV 或文本表格,方便在剪辑软件里对照检查。
- 输出前几个和最后几个 Note 的事件信息,便于判断范围是否异常。
3.2 示例:读取 JSON 并生成分节表
下面用 Python 写一个最小脚本,不绑定任何具体游戏格式。只需调整字段名即可适配不同谱面:
import json import csv import sys from pathlib import Path TICKS_PER_BEAT = 4 # 一拍包含 4 个 16 分音符,可根据谱面实际调整 def ms_to_musical_time(ms: float, bpm: float) -> str: beat_duration_ms = 60000.0 / bpm beat_position = ms / beat_duration_ms bar = int(beat_position // 4) + 1 beat_in_bar = int((beat_position % 4) // 1) + 1 tick = int((beat_position % 1) * 4) return f"{bar:04d}:{beat_in_bar}{'.' * tick}" def parse_chart(chart_path: Path, csv_path: Path): with open(chart_path, "r", encoding="utf-8") as fp: chart = json.load(fp) meta = chart.get("meta", {}) notes = chart.get("notes", []) bpm = float(meta.get("bpm", 0)) offset_ms = float(meta.get("offset_ms", 0)) if not notes: print("谱面里没有找到 notes 字段,请检查 JSON 结构。") sys.exit(1) notes_sorted = sorted(notes, key=lambda n: n.get("time_ms", 0)) with open(csv_path, "w", encoding="utf-8", newline="") as fp: writer = csv.writer(fp) writer.writerow( ["id", "time_ms", "track", "type", "duration_ms", "musical_time"] ) for n in notes_sorted: t = float(n.get("time_ms", 0)) + offset_ms musical_time = ms_to_musical_time(t, bpm) writer.writerow( [ n.get("id", ""), n.get("time_ms"), n.get("track", ""), n.get("type", ""), n.get("duration_ms", 0), musical_time, ] ) print(f"解析完成:共 {len(notes_sorted)} 个物件") print(f"BPM={bpm}, offset={offset_ms}") print(f"第一个 Note 时间:{notes_sorted[0].get('time_ms')} ms") print(f"最后一个 Note 时间:{notes_sorted[-1].get('time_ms')} ms") if __name__ == "__main__": parse_chart(Path("chart/cryogenic_fbd12.json"), Path("chart/cryogenic_fbd12.csv"))运行命令:
python scripts/parse_chart.py如果谱面没有 JSON 导出,只有固定列文本格式,可以先把文本转成 CSV,再复用上面的思路。脚本的重点是让“数据内容”变成“时间对齐依据”。
脚本执行后,chart/cryogenic_fbd12.csv里会出现类似如下内容:
id,time_ms,track,type,duration_ms,musical_time 1,1425,1,tap,0,0005:1... 2,1510,3,tap,0,0005:2... 42,9150,3,hold,480,0032:2这里的musical_time列能帮助你在剪辑软件里快速判断,某段轨道动画或转场点到底是落在正拍、后半拍还是 16 分音符上。
注意:如果使用毫秒作为 Event 时间单位,剪辑软件里很多默认刻度是秒或帧。175 BPM 下一拍约 342.86 毫秒,换算成帧数会带小数,建议时间线同时显示毫秒标尺,不要只靠帧数去凑节奏。
3.3 keymode 与难度标记的处理
keymode指同一时间可能激活的轨道数,例如 4K、6K、7K 模式。FBD12这种难度标记更像谱面难度内部代号,不是官方字段名,所以在脚本里不要当成固定配置写死。
处理思路是:
- 难度文本保留在导出标题或视频封面中,不进入解析逻辑。
- 轨道数量从谱面元数据读取,脚本根据轨道数量自动分色或分配提示文字。
- 如果谱面包含多个难度,目录按
难度标识 + 文件名区分,比如cryogenic_fbd12.json与cryogenic_fbd10.json。
如果谱面编辑器对象命名特殊,比如长条结束时间不写duration_ms而是单独一个end_ms,脚本要按编辑器规则先做一次规格化。脚本里最好写单元注释:
# 字段说明: # time_ms Note 出现时间,单位毫秒 # track 轨道编号 # type 物件类型:tap/hold/flick/swap # duration_ms 长指时长;tap 通常为 0这些注释能帮你两个月后重新读脚本时快速恢复记忆。
4. 进入剪辑工具做第一版预览视频
4.1 时间线设置:帧率、采样率、音频轨
打开剪辑工程时,优先建立与目标平台一致的帧率。如果准备输出 60 FPS,时间线设为 60 FPS,而不是 30 FPS。60 FPS 对密集谱面更友好,因为每个帧只对应约 16.67 毫秒,对齐误差上限更小;30 FPS 下每帧 33.3 毫秒,可能会让 16 分音符之间的间隔在画面里显得卡顿。
音频轨建议单独放一条完整无损音频。不要直接把 B 站或视频平台压缩后的音频拖进工程,二次转码会损失高频细节,虽然预览视频最终还要再压缩一次,但源头质量高一些,导出后的声音干净度会更好。
工程参数设置可参考:
| 参数项 | 推荐值 | 原因 |
|---|---|---|
| 帧率 | 60 FPS | 高密度谱面防抖动 |
| 分辨率 | 1920 x 1080 或 2560 x 1440 | 保证轨道文字清晰 |
| 音频采样率 | 48000 Hz | 与多数无损音频一致 |
| 音频位深 | 24 bit 或 16 bit | 减少量化噪声 |
| 时基 | 毫秒显示优先 | 便于按谱面数据锚点对齐 |
| 颜色深度 | 8-bit 或 10-bit | 动画复杂建议 10-bit 防色带 |
分辨率不是越高越好。如果你用游戏录屏作为素材且录屏分辨率低于目标工程分辨率,放大后画质会劣化。可以先确认原始素材分辨率,再决定工程分辨率。
4.2 用节拍图或波形锁定起终点
在剪辑软件中,把cryogenic_source.wav拖到音轨 A1。然后从谱面脚本输出的第一个 Note 时间和最后一个 Note 时间,算出需要截取的区间。
假设第一个 Note 是1425 ms,最后一个 Note 是108320 ms,可以按经验往前留 2 到 3 秒,往后留 2 秒淡出。不要从 0 毫秒直接开始,前面的静音会造成不必要的等待,但从第 1 个 Note 前 2 秒开始能让观众看到轨道和判定线进入画面。
如果剪辑工具支持“波形放大”,把波形放大到能看到 16 分音符颗粒度。找到每段副歌之前最明显的鼓点尖峰,做竖版参考线标记。这样即使不用 BPM 网格,也能通过视觉上强拍位置一致来验证。
有些剪辑工具里可以直接设置标记点,比如给副歌开始、间奏开始、Drop 开始各加一个标记。这里可以形成一张标记表:
| 标记名 | 谱面时间(ms) | 音频起始距离(ms) | 说明 |
|---|---|---|---|
| Intro | 0 | -120 | 音频第 0 ms |
| First Note | 1425 | 1545 | 画面出现第一个物件 |
| Drop A | 18240 | 18360 | 第一次副歌 |
| Break B | 50480 | 50600 | 间奏 |
| Final Note | 108320 | 108440 | 最后一个物件 |
| Outro | 108500 | 108620 | 尾奏开始 |
表格不是必须放进成片,而是给你自己的工作流程提供锚点。标记点越多,后期调整越容易。
4.3 转场与特效点位的思路:轨道运动、Note 遮蔽、判定文字
这一段属于“画面表现层”的核心。谱面预览不是单纯把整张谱面 Replay 录一遍,还要让观众理解谱面的“记忆点”。常见做法是:
- 用轨道颜色区分难度段落。同一首歌中,高速段可以用亮色背景,间奏段可以用暗色背景。
- 在 Drop 或主歌切换处做“瞬移”转场,把轨道从一个位置移动到另一个位置。
- 在长条 Note 开始点加
PERFECT或HOLD字样,提示这块是长条段。 - 在密集纵连前,额外插一帧“注意密度”文字或改变判定线闪烁颜色。
这些动效的核心是:不能盖住轨道。轨道是谱面的最终信息源,任何转场如果会让观众在一瞬间分不清 Note 落在哪条轨道,都属于过度设计。
可以给主轨和动效轨单独分轨。轨道分层建议如下:
| 视频轨道 | 内容 | 透明度/混合模式 |
|---|---|---|
| V5 | 最终标题和难度横幅 | 常显或淡入 |
| V4 | 判定提示文字、Combo 提示 | 事件驱动 |
| V3 | 转场覆盖、色块、镜头光斑 | 按段落出现 |
| V2 | 游戏画面或轨道动画 | 正常 |
| V1 | 封面、波形背景 | 常显或柔光 |
在剪辑工程里给 V2 和 V3 分别加 3 到 5 秒的转场缓冲,不要在一个强拍上既转场又出现长串 Note。信息密度在同一帧越高,越容易让人看漏。
5. 验证节奏对齐与画面同步
5.1 三种验证手段
第一版预览出来后,不要只看完整视频是否流畅。推荐用三种方式验证节奏对齐。
第一种是“整曲通喝”:用正常速度从第一秒看到最后一秒,重点检查有没有局部“赶”或“拖”。这种方式最接近观众体验,但只能排除明显错误。
第二种是“逐帧抽查”:选择副歌中一段密度较高的乐句,将播放头停在一个强音开始的帧,观察画面里 Note 是否与判定面对齐。60 FPS 下,同一个位置偏差不应超过 1 到 2 帧。如果某个重音处 Note 还没落下,说明整体时间偏慢。
第三种是“波形对照”:把渲染前的预览音频放到音轨 A2,把原始无损音频放到音轨 A1,调整相位后再对齐看峰值是否重合。虽然这个方法主要验证音频是否被错误裁切,但也能间接发现偏移。如果两轨波形峰值错开 50 ms,说明工程里有一段截取偏差。
5.2 检查清单与参数表
下面是一份可直接复用的同步验收清单:
- [ ] 音频文件采样率和剪辑工程一致。
- [ ] 第一个 Note 前留有足够进入观感时间。
- [ ] 最后一个 Note 结束后有自然淡出。
- [ ] BPM 和 offset 与谱面元数据一致。
- [ ] Note 事件表中的
time_ms是否重复出现相同时间点。 - [ ] 长条结束时间大于长条开始时间。
- [ ] 轨道动画速度是否在不同段落下差异过大。
- [ ] 视频导出后播放器内声画同步误差在 1 帧以内。
- [ ] 上传目标平台压缩后没有出现明显的卡帧。
检查时要区分“谱面本身”问题与“预览视频制作”问题。如果notes里有两个物件在同一毫秒落在同一条轨道,这通常是谱面问题;如果两个物件同一毫秒落在不同轨道却仍然跳帧,则可能是渲染设置问题。
5.3 如何知道“对好了”而不是“看起来差不多”
一个简便判断标准是:如果你把预览视频同时开两个窗口,一个是谱面编辑器的精确开始点,一个是视频里的对应帧,两边的 Note 出现时间相差不得超过视觉上一拍的三分之一。更严格一些,可以直接看波形和帧计数器:
在 60 FPS 工程里,假如某段起始点在18240 ms,对应放大到视频帧应该是1094.4帧附近,由于帧单位是整数,实际显示1094或1095都可以接受。但如果视频里 Note 显示在第 1100 帧,偏差约 93 毫秒,已经接近半拍,这时候视觉上会很明确地“别扭”。如果做不到精确位置,宁可让 Note 提前一点点出现,也不要推迟出现,音游玩家对“晚到”比“早到”更敏感。
注意:不要只验证程序能启动,还要验证每个段落的起始点、长条与纵连的衔接、以及转场附近的判定是否全部对齐。整段预览中任何 5 秒区域内出现明显偏移,都要回到时间轴上逐帧检查,不要试图通过调低音量或降低分辨率掩盖问题。
6. 常见问题排查
6.1 现象 1:BPM 正确但 Note 整体偏移
表现:视频里的 Note 出现时间比音乐强拍稍微偏前或偏后,所有 Note 偏移量基本一致。
可能原因:谱面元数据里的offset与音频起点不一致,或者剪辑时间线 0 点没有放在音频实际开始点。
检查方式:查看谱面 JSON 里offset_ms值,在剪辑软件里看音频第一个强峰的采样时间。
解决方案:把工程里音频素材开始位置整体向左或向右移动相应毫秒数。不要逐个调整 Note。
6.2 现象 2:片段开头对齐但后面越来越漂
表现:前面几小节看起来没问题,播放到 1 分钟之后明显越来越不同步,且偏差方向一致。
可能原因:BPM 设置错误。如果谱面是 175 BPM,但工程按 170 BPM 画网格,偏差会随着时间积累。另一种可能是谱面文件里包含变速段,即timing数组中有多次 BPM 变化,而你只读取了第一个 BPM。
检查方式:用脚本输出图表,计算每个 Note 的实际时间与按固定 BPM 计算的理想时间的差,偏差是否随小节数线性增长。
解决方案:如果只读取第一段 BPM,需要把谱面中所有bpm_change事件按顺序读取,在视频里做变速段。或者只在没有变速的段落里使用网格对齐。
6.3 现象 3:谱面无法进入编辑器或模拟器
表现:谱面 JSON 在脚本里能正常解析,但游戏编辑器或模拟器不认,提示缺少字段或格式错误。
可能原因:谱面文件经过了手工改名,或编辑器要求特定文件扩展名和校验字段。
检查方式:对照编辑器官方模板逐项检查meta、notes、timing字段名。确认文件编码是否为 UTF-8 无 BOM。检查导出时是不是选择了错误的游戏版本。
解决方案:原生谱面格式不要手写。如果要做预览,可以先用脚本生成中间格式,预览后再由原编辑器生成正式可玩文件。
6.4 排查顺序一览表
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 所有 Note 整体偏前/偏后 | offset 错误、音频起点错位 | 对比元数据 offset 与音频起点 | 调整整段音频起点 |
| 越到后面越偏 | BPM 设置错误或变速未处理 | 输出时间差异曲线 | 读取全部 BPM change |
| 局部几小节偏 | 剪辑转场导致时间线错位 | 查看标记点 | 把转场段放到独立轨道 |
| 长条结束不自然 | duration_ms 错误 | 检查长条起止时间 | 修正谱面事件数据 |
| 画面卡顿跳帧 | 工程帧率低于导出版 | 检查导出设置 | 统一时间线帧率并重渲染 |
| 音频模糊 | 使用有损音频或二次转码 | 检查源格式和采样率 | 换回无损源音频 |
| 音乐能播但物件消失 | 物件被转场层覆盖 | 检查轨道上下层级 | 把主画面层放 V2 以上 |
| 平台上传后音画不同步 | 导出文件有异常帧段 | 本地播放是否正常 | 重新导出或降低码率 |
排查时按“输入是否正确 -> 文件路径和命名 -> 依赖版本 -> 配置 -> 权限/资源 -> 日志异常”的顺序走,谱面预览项目里最常见的根因集中在输入、路径和元数据三处。
7. 发布前质量检查与最佳实践
7.1 导出的编码参数和文件规范
第一次渲染建议先导出一个小段样片,确认效果后再全曲导出。全曲导出建议使用 H.264 编码、MP4 容器,码率根据分辨率设置。1080p60 视频的常见码率档位是 8 Mbps 到 16 Mbps,如果原始画面包含大量高频闪烁元素,码率偏低会出现明显色块和拖影。更高码率不代表画质一定提升,还要考虑平台二次压缩策略。
FFmpeg 导出命令示例,用于在没有剪辑软件队列时快速预览成片:
ffmpeg -y \ -i project/render_seq%04d.png \ -i audio/cryogenic_preview_mix.wav \ -c:v libx264 \ -preset slow \ -crf 16 \ -r 60 \ -c:a aac \ -b:a 320k \ -pix_fmt yuv420p \ -shortest \ export/cryogenic_fbd12_preview_v01.mp4命令里用%04d.png表示按序号读取序列帧。实际导出时,如果是从剪辑软件导出 MP4,则不需要再用 FFmpeg 转码。这个命令适合做脚本化自动渲染或实验性输出。
文件名建议加上版本号和难度标识,例如cryogenic_fbd12_preview_v01.mp4,避免最终发布时误把旧版本传上去。
7.2 学习环境与正式发布环境的差异
学习阶段可以适当降低工作量:
| 阶段 | 音频 | 画面尺寸 | 帧率 | 重点 |
|---|---|---|---|---|
| 试制样片 | 降采样 44.1kHz 或 96kbps | 1280 x 720 | 30 FPS | 看整体结构与节奏 |
| 个人练习 | 无损源或高质量 WAV | 1920 x 1080 | 60 FPS | 检查动效与 note 同步 |
| 正式发布 | 无损源或高质量母带 | 1920 x 1080 / 2560 x 1440 | 60 FPS | 版权、音质、色彩、版本号 |
生产环境、也就是真正对外发布时,还需要补上版权确认:确认你是否有权公开使用该曲目的完整音频。如果没有明确授权,至少要谨慎处理整曲版权音频的使用范围。谱面画面如果来自游戏引擎或游戏内素材,也应留意游戏开发商对素材二次传播的要求。文章出现这些提醒,不是为了降低创作热情,而是希望发布过程更稳。
7.3 后续扩展:判定演示、多 P 谱面与自动生成视频
如果In Falsus这个团体或作者后续想批量发布不同难度的谱面预览,可以继续做几件提升效率的事情:
- 把谱面解析脚本扩展成“按难度批量输出 CSV”的工具。
- 用模板工程把谱面事件表转成字幕格式,在剪辑软件里自动显示
Combo或PERFECT提示。 - 如果能拿到渲染接口,把 Note 数据直接绘制到透明背景 PNG,再由 FFmpeg 合成。
- 让谱面作者提供难度注释,标出“长条段”“纵连段”“双押段”,比后期去猜准确得多。
另外,一个新的想法是把Cryogenic FBD12的谱面解析结果做成“可交互网页预览”,用 Web Audio 播放音频同步时间轴,这样观众不仅能看到视频,也能自行调整播放倍速。不过那需要另一套前端开发工作,已经超出普通剪辑范畴,可以作为后续扩展方向。
这篇内容的核心结论是:谱面预览的真正难点不在堆满特效和渲染参数,而在于谱面数据与画面时间轴的毫秒级对齐。只要先把文件目录、BPM、offset、谱面 JSON、事件表这些基础工程做扎实,后续剪辑和发布都会顺很多。对新手最有价值的练习,是从自己制作或开源社区提供的谱面文件中,挑一段密度适中的乐句,做完完整的解析、渲染、逐帧验证流程,再拿这段经验去处理更复杂的 12 级谱面。