Node.js 批量文件合並code
cnblogs @ Orcim
本 文主要介紹使用 Node 進行 ACB 序列文件(Atom CueSheet Binary,編譯 AtomCueSheet 二進制文件)進行合並的方法。
ACB 文件
ACB文件是日本一家叫做 CRI Middleware 的公司開發的音頻包文件,包含ADX或ADX2格式的音頻流。主要用於游戲中的聲音特效以及背景音樂。其廣泛用於 Unity 開發的各種游戲之中,游戲廠商將音頻轉換為這種二進制的音頻文件,再將其打包成 Unity 的資源包(Assets),也就是游戲的資源更新包。而游戲廠商有時將一個 ACB 文件分割成多個二進制文件,這樣就需要將其先合並。
ACB文件可以用 CRI Atom Craft 進行查看以及編輯,當然,這個軟件也是由這家公司所開發。
關於ACB文件以及ADX2的更多詳情,參見官方文檔。感覺這種音頻文件挺有趣的。
對於我為什么想寫此篇博文,以及我為什么要用Node來做ACB文件合並這件事,只是因為偶然在提取游戲資源時碰到了ACB音頻文件(起初我還並不知道這是音頻流)沒事干,折騰了一下,撰文記錄我一個晚上的研究成果。
以上是這類二進制音頻流文件的科普,以下正文。
ACB文件序列一覽
下圖是我用UnityStudio_x64從某個游戲中的Assets文件中提取出來的ACB源文件:
一段 BGM 被分割成了總共 41 個文件,提取出來的文件后綴是 .txt,文件是二進制的,用記事本打開會亂碼。需要將這些文件合並成一個 ACB 文件。文件名是按規律來排列的:bgm133-[ Number ].acb.txt
思路
1)首先先讀取這些 .acb.txt 文件的二進制數據,因為文件有按照數字編號排列,所以要按順序進行讀取並合並。
2)接下來就是進行讀文件的操作,得到文件的 Buffer,一個類數組的數據
3)然后將這些文件的 Buffer 合並,這一步類似於多個數組進行 concat 的操作
4)最后一步依據合並得到的數組創建一個 Buffer 對象,例:_buf_,NodeJs 中是用 var buf = Buffer.from( _buf_ ),再寫文件 fs.writeFileSync("unite.acb", buf)
方案實施
具體流程,詳見代碼 unite.JS:
使用方法
-
將unite.js放在ACB序列文件所在的根目錄下
-
打開命令行工具,運行 unite.js:可以將js文件直接拖到命令行窗口中運行。
-
合並成功
-
合並后目錄下會合並寫好一個unite.acb文件,文件可以通過 VGMToolbox 工具進行提取,轉換為 .hca 音頻,foobar2000 安裝 VGMStream Decoder 插件后(點擊下載,解壓后雙擊安裝),即可播放 .hca 音頻或進行格式轉換
結束語
使用工具:NodeJS、UnityStudio、VGMToolbox、foobar2000、VGMStream Decoder