【分享】音频合并器

图片可以打图集,优化DrawCall,又可以减少请求数。
但音频就不行了,一个项目做下来,几百个MP3,请求数好几百,怎么办?

分享给大家,音频打包工具!
https://naogua.ren/projects/s3/
这个工具将多个音频文件打包成一个*.s3文件,通过SoundSpriteSheet解析和播放。
代码开源,你们也可以实现自己的播放方法。

12赞

增加一个COCOS API,可以直接插入s3文件,并解析成cc.AudioClip。GrowBuffer 源码在SoundSpriteSheet.ts 中。

const { ccclass, property } = cc._decorator;
@ccclass
export default class CCS3Input extends cc.Component {
    @property([cc.Asset])
    assetList: cc.Asset[] = [];
    protected onLoad(): void {
        this.assetList.forEach(asset => {
            fetch(asset.nativeUrl)
                .then(res => res.arrayBuffer())
                .then(binary => {
                    this.readS3File(binary);
                });
        });
    }
    readS3File(bin: ArrayBuffer) {
        let gBuf = new GrowBuffer(bin);
        let mp3Name = gBuf.readString(); //name
        let count = gBuf.readUint8();
        let isConcat = gBuf.readBool();
        let names = [];
        for (let i = 0; i < count; i++) {
            let nodeU8 = gBuf.readUint8Array();
            let gb = new GrowBuffer(nodeU8.buffer);
            gb.readUint16(); //start
            gb.readUint16(); //end
            names.push(gb.readString());
        }
        if (isConcat) {
            console.error("不兼容旧版文件。");
            return;
        }
        for (let i = 0; i < count; i++) {
            let soundBinary = gBuf.readUint8Array();
            let blob = new Blob([soundBinary], { type: 'audio/mp3' });
            let url = URL.createObjectURL(blob);
            let ind = i;
            cc.assetManager.loadRemote(url, { ext: ".mp3" }, (err, clip: cc.AudioClip) => {
                console.log("解析clip:", err, clip);
                URL.revokeObjectURL(url);
            });
        }
    }
};

2赞

markk

好想法,期待demo

https://gameptr.com/project/hpl_games/?gameConf=Piano
image

demo是不是打不开了

mark!

6666
这很需要啊.

网站有点慢,小水管。

从CCS3Input可以反推出如何集成mp3了.

mark!!!

这不是加密,只是把所需音频文件二进制打包。

一开始的方案是将多个音频合并成一个长的音频,并用howl库控制播放。
后面发现还不如现在这样,直接把多个音频文件打包成一个文件,读取时直接解析独立的音频数据。

marrrrrrrrrrrrrrrrk

好东西xxxxxxxxxxxx