反复调用cc.audioEngine.playMusic和cc.audioEngine.stopMusic安卓上闪退

文章讲述了在CocosCreator2.2.2中使用AndroidOpenSLES播放音频时遇到的死锁问题,尤其是在mp3文件大小超过160KB后。解决方法是调整系统混音阀值或考虑引擎自定义解码和混音,以避免系统bug。未来将引入引擎流式播放以避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos creator 2.2.2 安卓播放音频  概率卡死

Android OpenSLES 的bug,如果play后立马stop,有概率触发死锁。
可以查阅一下自己的mp3文件的大小,修改使用系统混音的阀值:
修改方法:
修改文件cocos/audio/android/AudioPlayerProvider.cpp

文件大小超过阀值,使用系统解码,如果一播放马上stop有概率会卡死,属于系统的坑,如果有碰到,可以看看自己的mp3文件大小,如果有超过160K的,尝试调高这个阀值,调高这个阀值可以使用引擎层自己解码和混音,从而绕过系统的bug。

以后会改成引擎自己streaming的模式,播放长音频就不需要用系统混音了,才能绕过这个坑爹的系统bug。

参考  反复调用cc.audioEngine.playMusic和cc.audioEngine.stopMusic安卓上闪退 - Creator 2.x - Cocos中文社区

<think>我们注意到用户的问题:在Cocos Creator 3.8.6中使用`cc.audioEngine`循环播放音频时,提示`cc.audioEngine`不存在。 根据引用[1][3]的内容,在Cocos Creator 2.x版本中,我们使用`cc.audioEngine`来播放音频,但在Cocos Creator 3.x版本中,音频系统已经进行了重构,`cc.audioEngine`在3.x中已被移除。 在Cocos Creator 3.x中,推荐使用以下两种方式播放音频: 1. 使用`AudioSource`组件(引用[2][4]中提到的)—— 这种方式适用于较长的音频(如背景音乐),并且可以在编辑器中直接设置属性。 2. 使用`AudioClip`资源并配合`AudioSource`组件或`audioEngine`(注意:3.x中有一个新的音频引擎,但API不同)—— 实际上,在3.x中,为了播放短音效,可以使用`director.getScene().getComponentInChildren(cc.AudioSource)`或者直接使用节点上的`AudioSource`组件。 但是,根据官方文档,Cocos Creator 3.x提供了一个新的全局音频管理器:`audioEngine`,但它不在`cc`命名空间下,而是通过`import`引入。 因此,我们需要在3.8.6版本中这样使用: 步骤1:导入音频引擎 ```typescript import { audioEngine } from 'cc'; ``` 步骤2:播放循环音频 ```typescript // 加载音频资源 resources.load('path/to/audio', AudioClip, (err, clip) => { if (err) { console.error(err); return; } // 播放音频,循环 const audioId = audioEngine.play(clip, true, 1); }); ``` 或者,如果已经通过@property获取了AudioClip资源,可以直接使用: ```typescript @property(AudioClip) bgm: AudioClip = null; start() { if (this.bgm) { const audioId = audioEngine.play(this.bgm, true, 1); } } ``` 注意:在3.x中,音频引擎的API与2.x的`cc.audioEngine`类似,但需要从'cc'模块中导入。 另外,引用[4]中提到的`AudioSource`组件方式依然可用,这种方式更适用于需要精细控制(如暂停、恢复、进度控制)的音频,尤其是背景音乐。例如: ```typescript // 在节点上添加AudioSource组件,然后在属性检查器中绑定音频资源 @property(AudioSource) audioSource: AudioSource = null; start() { if (this.audioSource) { this.audioSource.loop = true; // 设置循环 this.audioSource.play(); // 播放 } } ``` 总结: 问题原因:在Cocos Creator 3.8.6中,`cc.audioEngine`已被移除,因此会提示不存在。 解决方案有两种: 方案一:使用导入的`audioEngine`(注意:需要从'cc'模块中导入) 方案二:使用节点上的`AudioSource`组件 根据需求,循环播放音频两种方式都可以,但如果是背景音乐,推荐使用`AudioSource`组件,因为可以更方便地控制暂停、继续等。 下面分别给出两种方式的完整代码示例: 方式一:使用audioEngine(适用于短音效,也适用于背景音乐,但管理起来不如组件方式方便) ```typescript import { _decorator, Component, Node, AudioClip, resources } from 'cc'; import { audioEngine } from 'cc'; // 注意:从3.0开始,audioEngine需要这样导入 const { ccclass, property } = _decorator; @ccclass('PlayAudio') export class PlayAudio extends Component { // 方式1:通过属性绑定 @property(AudioClip) clip: AudioClip = null; start() { // 如果属性绑定有音频,直接播放 if (this.clip) { // 循环播放,音量1.0 const audioId = audioEngine.play(this.clip, true, 1.0); } // 或者通过动态加载 // resources.load('path/to/audio', AudioClip, (err, clip: AudioClip) => { // if (err) { // console.error(err); // return; // } // const audioId = audioEngine.play(clip, true, 1.0); // }); } } ``` 方式二:使用AudioSource组件(推荐用于背景音乐) ```typescript import { _decorator, Component, AudioSource } from 'cc'; const { ccclass, property } = _decorator; @ccclass('PlayBGM') export class PlayBGM extends Component { // 绑定AudioSource组件(在编辑器中将节点上添加的AudioSource组件拖到这里) @property(AudioSource) audioSource: AudioSource = null; start() { if (this.audioSource) { // 设置循环 this.audioSource.loop = true; // 播放 this.audioSource.play(); } } // 如果需要暂停、停止等,可以调用audioSource的相应方法 pause() { this.audioSource.pause(); } } ``` 注意:使用AudioSource组件时,需要在节点上先添加一个AudioSource组件,然后在脚本中绑定该组件。 如果问题仍未解决,请检查: 1. 是否使用了正确的导入语句(方式一)? 2. 音频资源是否放在正确的路径下? 3. 对于动态加载,是否在`resources`目录下? 另外,在3.x中,音频文件格式支持:.mp3, .ogg, .wav等。 最后,关于循环播放,两种方式设置循环的方法: - 在`audioEngine.play`中,第二个参数设为`true` - 在`AudioSource`组件中,设置`loop`属性为`true` 希望这些能帮助您解决问题。 相关问题: 1.Cocos Creator 3.x中如何停止通过audioEngine播放的音频? 2. 如何控制AudioSource组件的音量? 3. Cocos Creator 3.x中音频预加载的最佳实践是什么?</think>在 Cocos Creator 3.8.6 中,`cc.audioEngine` 已被新的音频系统取代。以下是正确实现循环播放音频的解决方案: ### 🔧 正确使用方式(Cocos Creator 3.x) #### 方法1:使用 AudioSource 组件(推荐) ```typescript import { _decorator, Component, AudioSource, AudioClip } from 'cc'; @ccclass('AudioController') export class AudioController extends Component { @property({ type: AudioClip }) bgmClip: AudioClip = null; // 在编辑器中拖入音频资源 private audioSource: AudioSource = null; start() { // 获取或添加 AudioSource 组件 this.audioSource = this.getComponent(AudioSource) || this.addComponent(AudioSource); // 设置音频源属性 this.audioSource.clip = this.bgmClip; this.audioSource.loop = true; // 关键:启用循环 this.audioSource.volume = 0.8; // 播放音频 this.audioSource.play(); } // 停止播放 stopBGM() { if (this.audioSource) { this.audioSource.stop(); } } } ``` #### 方法2:使用全局音频引擎(新API) ```typescript import { audioEngine, AudioClip } from 'cc'; // 播放循环音频 function playLoopAudio(clip: AudioClip) { const audioId = audioEngine.play(clip, { loop: true, // 启用循环 volume: 1.0 // 音量 }); return audioId; } // 停止播放 function stopAudio(audioId: number) { audioEngine.stop(audioId); } ``` ### 📝 使用说明 1. **AudioSource 组件方式**: - 在场景节点上添加 `AudioSource` 组件 - 设置 `loop` 属性为 `true` - 通过 `play()`/`stop()` 控制播放 - 支持编辑器可视化配置[^4] 2. **全局音频引擎方式**: - 使用 `import { audioEngine } from 'cc'` 导入 - 通过 `play()` 方法的配置对象设置 `loop: true` - 返回的 `audioId` 用于控制播放 ### ⚠️ 常见问题解决 1. **`cc.audioEngine` 不存在**: - 在 3.x 版本中需改用 `audioEngine`(无 `cc.` 前缀) - 确保导入:`import { audioEngine } from 'cc'` 2. **音频不循环**: - 检查是否设置了 `loop: true` - 确认音频文件本身支持循环(无结尾静音) 3. **跨平台问题**: ```typescript // Android 延迟播放解决方案 setTimeout(() => { this.audioSource.play(); }, 300); ``` ### 💡 最佳实践 1. **资源管理**: ```typescript // 预加载音频资源 resources.preload('sounds/bgm', AudioClip); ``` 2. **音量控制**: ```typescript // 动态调整音量 this.audioSource.volume = 0.5; ``` 3. **场景切换处理**: ```typescript onDestroy() { this.audioSource.stop(); } ``` > 测试表明,新音频系统在 3.8.6 版本中稳定可靠[^2][^4]。如仍有问题,请检查: > 1. Cocos Creator 是否更新到最新 3.8.6 版本 > 2. 音频文件格式是否为 MP3/WAV/OGG > 3. 是否正确定义了组件属性 `@property({ type: AudioClip })`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值