【求助帖】没有后缀名的音频文件,怎么加载?怎么转成AudioClip

bundle下的音频文件abcd,仅仅没有文件后缀名,其实还是mp3文件,怎么加载,把它变成可识别的 AudioClip ?

尝试过放远程服务器可以,通过指定 ext, 如下:

assetManager.loadRemote('https://cocos.com/abcd', { ext: ".mp3" }....

但是本地的bundle下的加载,我搞了一天了,找不到好方法。

能不能加载了之后转成arraybuffer的形式去用呢

image
好奇之下尝试了一下,构建的时候,不带后缀的音频资源没有被识别为AudioClip,直接把类型标记为Asset了。


然后加载的时候是会根据类型去获取对应的资源信息,这边应该就获取不到了。


翻了一下源码,看上去还是通过后缀名区分是否解析为音频的,后缀名是可以通过加载选项的ext字段指定的。不过Bundle.load接口不支持自定义加载选项,但它内部实际上调用的是assetManager.loadAny接口,因此可以直接尝试使用assetManager.loadAny接口来加载不带后缀的音频文件。

assetManager.loadAny('abcd', {
    __requestType__: RequestType.PATH,
    type: Asset,
    ext: '.mp3',
    bundle: 'bundleName',
    __outputAsArray__: false,
}, onProg, onComp);

PS:纯看源码推导出来的方案,没实际测试过 :joy:

2赞

好吧,我来说一下我通过曲线救援的方式解决了。

你这个试过了,不行的,上面那个说二进制的方法也是不行的,可以说官方的 bundle 加载方案就不支持无后缀的文件,因为最终还是会走到pipeline的 sync方法中,依然会通过类型来获取资源。

我最终的方式是通过资源的uuid,获取到 raw path,假设为bundle/import/93/936806f6-60ac.json,再拼出http://localhost:7456下的链接 url,而拼出的url依然会默认为 .json 的后缀名,再把这个后缀删掉,最后再通过ssetManager.loadRemote(‘https://localhost:7456/bundle/import/93/936806f6-60ac’, { ext: “.mp3” }) 的方式加载就可以了。

我个人认为官方的 load 还是可以优化的。

那可以尝试个更简单直接的,在构建后,把config.json里面记录的类型 cc.Asset 直接改成 cc.AudioClip,这样应该就不需要改加载了。 :sunglasses:

现在的问题就在于构建之后,存在bundle里面的资源信息类型是Asset而不是AudioClip,这个只能看后续官方有没有打算加个处理,不根据后缀名记录这个类型了。

强者 恐怖如斯 :star_struck: