抖音小游戏使用长音频和短音频
介绍
最近好久没有更新文章了,最近在研究抖音小程序也在帮公司做抖音小游戏这块,正好之前遇到了一个比较困扰的问题就是小程序长音频的问题,这个问题开始没有认为是个问题,因为我使用的是Unity2021.3.14f做的开发,所以下载了抖音开发工具包如下图是我下载的相关插件和版本(这个我就不放链接了,抖音开放平台的文档会有他们自己连接)。
WebGL对Unity音频的限制
功能限制
Unity WebGL 仅支持有限的音频功能:
- 由于 Unity 在 WebGL 平台音频实现与原生平台存在较大差异,其本身仅支持有限的音频功能,这些限制也存在于小游戏 WebGL 环境中。
- 具体支持范围可参考 Unity 官方文档
在小游戏环境中,还存在以下额外的特性或限制:
- AudioSource
- 音频固定按默认音调、1 倍速播放。不支持调整音调和播放速率相关属性:pitch。
- 音频组件均视为 2D Audio,在空间中的位置关系不会对音频效果产生影响。不支持空间音频相关属性:dopplerLevel、maxDistance、minDistance、rolloffMode、velocityUpdateMode。
- AudioClip
- LoadType 仅支持 Decompress on Load、Compressed In Memory,不支持 Streaming。
- 实际的 LoadType 会根据音频 Buffer 的大小、以最小内存占用为目标动态适配决定,无需开发者适配。
- 具体来说,我们以 AudioClip 资源构建后压缩产生的 AAC 二进制数据是否大于 128k 为标准,将其区分为短音频和中长音频。
- 短音频会视为 Decompress on Load,在 AudioClip 加载时解码,解码后的 32 位浮点线性 PCM 数据将一直占用内存直到该资源释放;
- 中长音频会视为 Compressed In Memory,自动切换至调用 StarkAudio 音频接口本地播放,流式解码以优化内存占用。
- 32 位线性 PCM 数据内存占用量(字节) = 时长(秒) x 通道数量 x (32 / 8) x 44100Hz
在设计游戏音频体验或相关玩法时,开发者应避免使用不受支持的能力。
优化建议
对于音频性能,还有以下优化建议:
- 双声道音频内存占用比单声道多一倍,如无必要建议使用单声道的 AudioClip。
- 建议对同时处于播放状态的 AudioSource 音效数量做出合理限制。
Iphone静音不同策略
如果要用Iphone玩的话一定要打开静音键,因为关掉静音键短音频不播放。
iOS 处于静音模式且未连接耳机时,短音频和中长音频会遵循的不同的静音策略。
Unity中播放长音频无法播放可以使用以下方法
var op = new StarkAudioManager.InnerAudioContextOptions
{
src = "http://127.0.0.1/sound/Battle.mp3", // 音频资源的 url 地址
autoPlay = true,
loop = false,
needDownload = true
};
var ctx = StarkAudioManager.CreateInnerAudioContext(op);
ctx.Play();
注意事项
- StarkAudio 同时支持 Native 和 WebGL 方案。
- 仅支持 wav、mp3、m4a、aac 格式,推荐使用 44100 hz 采样率。
- 音频资源会根据 url 缓存,更新音频文件时请改变 url 或 query string,否则可能因缓存导致不生效。
- 尽量避免高频创建 InnerAudioContext,建议用对象池管理并复用 InnerAudioContext 实例,一定时间内不使用的实例及时销毁。
更多使用方式可参考 StarkAudioManager 接口注释。
总结
感谢大家支持!