图片可以打图集,优化DrawCall,又可以减少请求数。
但音频就不行了,一个项目做下来,几百个MP3,请求数好几百,怎么办?
分享给大家,音频打包工具!
https://naogua.ren/projects/s3/
这个工具将多个音频文件打包成一个*.s3文件,通过SoundSpriteSheet解析和播放。
代码开源,你们也可以实现自己的播放方法。
图片可以打图集,优化DrawCall,又可以减少请求数。
但音频就不行了,一个项目做下来,几百个MP3,请求数好几百,怎么办?
分享给大家,音频打包工具!
https://naogua.ren/projects/s3/
这个工具将多个音频文件打包成一个*.s3文件,通过SoundSpriteSheet解析和播放。
代码开源,你们也可以实现自己的播放方法。
增加一个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);
});
}
}
};
markk
好想法,期待demo
demo是不是打不开了
mark!
6666
这很需要啊.
网站有点慢,小水管。
从CCS3Input可以反推出如何集成mp3了.
mark!!!
这不是加密,只是把所需音频文件二进制打包。
一开始的方案是将多个音频合并成一个长的音频,并用howl库控制播放。
后面发现还不如现在这样,直接把多个音频文件打包成一个文件,读取时直接解析独立的音频数据。
marrrrrrrrrrrrrrrrk
好东西xxxxxxxxxxxx