1.6.0 beta3 暂停音频跟恢复音频错误。

  • Creator 版本号:1.6.0-beta3
  • 目标平台:IOS 10.3.3
  • 详细报错信息,包含调用堆栈:

res/raw-assets/resources/sounds/hallbg.mp3
I/AudioEngine-inl.mm (353): OpenAL was initialized successfully!
V/AudioCache (129): AudioCache() 0x139dd5008, id=1
V/AudioCache (197): readDataTask, cache id=1
cocos2d: QuadCommand: resizing index size from [-1] to [2560]
V/AudioPlayer (148): AudioPlayer::play2d, _alSource: 2400
doClose [object Object]
D/AudioEngine-inl.mm (166): UIApplicationWillResignActiveNotification
cc.audioEngine.pauseAll
cc.audioEngine.resumeAll
D/AudioEngine-inl.mm (176): UIApplicationDidBecomeActiveNotification
D/AudioEngine-inl.mm (166): UIApplicationWillResignActiveNotification
cc.audioEngine.pauseAll
cc.audioEngine.resumeAll
D/AudioEngine-inl.mm (176): UIApplicationDidBecomeActiveNotification
D/AudioEngine-inl.mm (166): UIApplicationWillResignActiveNotification
cc.audioEngine.pauseAll
cc.audioEngine.resumeAll
D/AudioEngine-inl.mm (176): UIApplicationDidBecomeActiveNotification
D/AudioEngine-inl.mm (166): UIApplicationWillResignActiveNotification
D/AudioEngine-inl.mm (131): AVAudioSessionInterruptionTypeBegan, application != UIApplicationStateActive, alcMakeContextCurrent(nullptr)
cc.audioEngine.pauseAll
E/AudioEngine-inl.mm (519): bool cocos2d::experimental::AudioEngineImpl::pause(int): audio id = 0, error = a003
cc.audioEngine.resumeAll
E/AudioEngine-inl.mm (533): bool cocos2d::experimental::AudioEngineImpl::resume(int): audio id = 0, error = a003
D/AudioEngine-inl.mm (176): UIApplicationDidBecomeActiveNotification
D/AudioEngine-inl.mm (192): Audio session is still interrupted, pause director!
[Edit text] content size = (160.000000, 40.000000)
[Edit text] content size = (160.000000, 40.000000)
[Edit text] content size = (419.000000, 50.000000)
[Edit text] content size = (419.000000, 50.000000)
V/AudioCache (129): AudioCache() 0x139ddd8d8, id=2
V/AudioCache (197): readDataTask, cache id=2
V/AudioCache (249): Orignal total frames: 31104, adjust frames: 529, current total frames: 31633
V/AudioPlayer (148): AudioPlayer::play2d, _alSource: 2401
E/AudioPlayer (162): OpenAL error 0xA003 in /Users/jack/work/H5/HSBC/build/jsb-default/frameworks/cocos2d-x/cocos/audio/apple/AudioPlayer.mm play2d 162

E/AudioPlayer (163): OpenAL error 0xA003 in /Users/jack/work/H5/HSBC/build/jsb-default/frameworks/cocos2d-x/cocos/audio/apple/AudioPlayer.mm play2d 163

E/AudioPlayer (164): OpenAL error 0xA003 in /Users/jack/work/H5/HSBC/build/jsb-default/frameworks/cocos2d-x/cocos/audio/apple/AudioPlayer.mm play2d 164

E/AudioPlayer (165): OpenAL error 0xA003 in /Users/jack/work/H5/HSBC/build/jsb-default/frameworks/cocos2d-x/cocos/audio/apple/AudioPlayer.mm play2d 165

E/AudioPlayer (209): OpenAL error 0xA003 in /Users/jack/work/H5/HSBC/build/jsb-default/frameworks/cocos2d-x/cocos/audio/apple/AudioPlayer.mm play2d 209

E/AudioPlayer (218): bool cocos2d::experimental::AudioPlayer::play2d():alSourcePlay error code:a003
V/AudioCache (312): pcm buffer was loaded successfully, total frames: 31633, total read frames: 31104, adjust frames: 529, remainingFrames: 529

  • 做了什么操作引起的 Bug:
    切换任务的时候,重复切换其他游戏,有背景音乐的游戏。就会出现这个。
    然后,游戏就被暂停了。很容易重现

@panda

原生AudioEngine-inl.mm (192)。 。。看看吧。

else if (isAudioSessionInterrupted)
{
ALOGD(“Audio session is still interrupted, pause director!”);
Director::getInstance()->pause();
}

为何没人解决一下啊???@wangzhe

前后台切换的时候,你会手动调用cc.audioEngine.pauseAll resumeAll么?
如果会,请不用手动调用试试看,audio的pauseAll和resumeAll在audioengine内部会被自动控制。上层没必要手动调用。

内部会自动控制了?那我注释掉再试试。

嗯,请问情况如何了?

我这边也出现了这个问题,操作步骤如下:

1、打开我的游戏,背景在播放音乐

2、双击home键,这个时候触发了UIApplicationWillResignActiveNotification事件,音乐依旧在播放

3、选中另外一个有背景音乐的游戏,这个时候会触发AVAudioSessionInterruptionTypeBegan事件,然后再触发applicationDidEnterBackground事件

4、这个时候再双击home切回来,先收到applicationWillEnterForeground,再收到UIApplicationDidBecomeActiveNotification事件。由于没有收到AVAudioSessionInterruptionTypeEnded事件,导致如楼上所说的AudioEngine-inl.mm (192) 里将整个Director给pause掉了

我这边几乎所有设备都100%必现,唯一区别是AVAudioSessionInterruptionTypeBegan事件有些设备是在切出去的时候收到,有些设备是在切回来的时候收到,但共同点就是没有收到AVAudioSessionInterruptionTypeEnded事件

求解 @dumganhar

已解决。我将

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: &error];

这句放到了AppController.mm里刚启动的时候执行,就没有问题了。默认的Category应该是AVAudioSessionCategorySoloAmbient,切换App的时候会被中断,改成AVAudioSessionCategoryAmbient后就不会被中断了

@dumganhar

的确,默认的Category是AVAudioSessionCategorySoloAmbient,这块的确需要配套使用,没理由做下前后台切换就改变了category。
AVAudioSessionCategoryAmbient模式下,如果有其他应用的背景音乐在播放,切换到游戏,游戏音乐会与其他应用的的背景音乐混合在一起。这样体验不是很好。是否强制都用AVAudioSessionCategorySoloAmbient这种独占模式会好点?

PR:
https://github.com/cocos-creator/cocos2d-x-lite/pull/809
放在初始化AudioEngine的时候去设置AVAudioSessionCategorySoloAmbient

的确,像网易云音乐这种在后台一直播放音乐的,切回游戏后还会继续播放。

但是目前SoloAmbient模式有个致命的问题是由于中断的begin和end事件不匹配,会导致游戏卡死,在无法根治这个问题的状况下,我只能选择Ambient模式

1赞

嗯,暂时先选择Ambient,毕竟游戏一般都有一个关闭音乐和音效的设置。如果不想要其他app的音乐,去那个app关闭即可。如果需要另外app的音乐,去游戏内部关闭音效即可。

注释掉以后解决没有?

你好这个问题解决了吗 我也遇到这个问题了 求解

1.8.2又出现该问题
查了代码是AVAudioSessionInterruptionTypeEnded 这个没通知

重现方法: 游戏播放音效, 设备截图, 在分享, 点邮件, 在通过左上角返回游戏, 这样就能卡死
多台设备能重现

能整理一个小 demo 给我们测试排查一下么?

1赞

大哥有怎么解决吗

重现方法: 游戏播放音效, 设备截图, 在分享, 点邮件, 在通过左上角返回游戏, 这样就能卡死
多台设备能重现
请问这个问题后面解决了吗,我在1.9.1上也出现了这个问题,复现方法和上面一样