欢迎光临散文网 会员登陆 & 注册

关于我如何在一个小时内发布版本音乐视频

2023-04-11 20:22 作者:unipendix  | 我要投稿

本文旨在分享个人优化原神版本音乐视频发布流程的一些想法和实践

根据网上现有的工具一般来说发布游戏音乐的发布流程为:

  1. 下载游戏包体或更新包

  2. 解压相关文件

  3. 解包音频

  4. 导入进视频编辑器

  5. 生成视频

  6. 上传视频

采用这种手工方式不仅有大量的重复操作,还要忍受漫长的视频编解码过程。如果新地图一开或者大版本更新,则会花费数小时进行操作(以1.0版本为例,500多首我花费了半天才搞定)。

为了节省我宝贵时间的同时加快音乐的处理,我决定采用python脚本加速投稿流程。核心步骤分为获取音频和生成视频。

下载游戏包体或更新包

首先是资源包获取,一般来说需要下载完整的更新包才能拿到新版本音乐。

但是好像在2.2版本后启动器引入了一个资源修复机制,当启动器发现有文件损坏或者缺失时它会从获取资源的API中拿到一个叫“解压目录”的网址,其下的http目录结构和游戏根目录的完全一样,从而启动器可以选择性的下载对应的文件。这时候我只需要通过这个API获取新版本需要下载的音乐文件即可。

部分API返回数据展示

解包音频

原神音频解包采用的是Wwise的FilePackage格式,我一共用过两个软件,quickBMS和Ravioli Game Tools。前者支持命令行操作,后者专门对FilePackage解析做了适配,可以导出bnk,而且带有ID(但解析不了语音包,似乎是适配问题),还可以配合ww2ogg将vorbis编码格式的wem文件转换为ogg,但是似乎不支持命令行。两种软件都不能满足我对音频解包的需求,通过分析Wwise SDK的代码我自己写了个解包脚本(现已上传至GitHub:https://github.com/BUnipendix/WwiseFilePackager)。

(FilePackage的结构分析我就不写了)

FilePackage里所有音频的文件信息都写在了文件头里(包括ID、语言、文件类型、位置、大小)而同语言下相同的文件都有相同的ID,所以只需要下载文件头,读取里的ID、文件大小和位置,就可以在不完全下载音乐包的情况下快速确定和下载新音乐和修改过的音乐(当然只是ID变的音乐还是无法避免的被误下载,这种情况我在下载后增加了一个校验步骤,生成指纹和本地文件的进行对比,从而尽量避免这种情况发生)

生成视频

生成视频这种运算量过大的操作我准备交给大名鼎鼎的ffmpeg。一开始我准备使用音频可视化,但是这种要么无法接入python,要么速度奇慢。最后我选择了静态图片和循环视频作为生成视频的模板,因为这种视频因为画面固定,所以我可以通过“预编码”来节省时间:静态图片先需要生成3-5秒的视频,再输入ffmpeg,“stream_loop”参数将其拼接成无限循环的视频输入,"-c:v copy"参数让ffmpeg拷贝视频流而不会二次编码,大大提高了视频生成速度,最后用-t参数控制视频长度与音频一致,防止视频无限生成下去。

视频的生成通过python直接在下载转换完成后执行,最大化利用时间

3.2版本后:我准备使用先行介绍页的spine动画,但是因为魔改加入物理的缘故既无法导入专门的软件渲染,也无法形成循环动画,所以我用了个取巧的方法:录制大约4分钟的动画(用的obs里的游览器,用调试器去掉了UI),直接传入之前的循环视频解决方案,因为“-t”的存在,ffmpeg会根据关键帧在不二次编码的情况下裁切视频,当音频长度超过视频也只会有一瞬的衔接痕迹,基本无感。

视频上传

自从阿b关闭了网页多P上传通道,我一直寻找上传多P的方法:

  1. 官方客户端虽然可以上传多P,但是只支持一次拖拽一个文件,上传速度还不稳定,经常卡住,并且一次最多只能上传100个分P。

  2. 自己根据biliup-rc的逻辑写的python版,准备完全放开双手,但是稳定性很差,动不动上传错误,而且因为API的缘故,一次只能上传一个视频。

  3. biliup-rc本身命令行打字耗时,而且必须在上传完成前确定文字内容

  4. biliup-rc的GUI版biliup-app支持多文件拖拽上传,可以随时修改稿件,但是功能没有网页丰富,无法查看推荐tag

最终我用了biliup-rc的GUI版biliup-app

总结

优化后的流程的最耗时间的反而是上传视频。以3.6版本为例,经测试,除去上传视频总共只耗时2分钟,而视频上传则花了10分多钟。


脚本日志开头
脚本日志结尾


关于我如何在一个小时内发布版本音乐视频的评论 (共 条)

分享到微博请遵守国家法律