SKAction playSoundFileNamed 连续接到两个电话后不起作用

问题描述 投票:0回答:3

我试图找出为什么 playSoundFileNamed 在连续接到两个电话后不起作用。实际上,它只有在接到第一个电话后才起作用。重现步骤是:

  1. 开始游戏
  2. 等待电话并进入后台
  3. 电话已结束(被呼叫者拒绝或打断)
  4. 返回前台

此后,播放touchesBegan中的声音仍然有效。

当我重复上面的步骤(跳过第一步)时,touchesBegan 的机制停止工作。不知道为什么会发生这种情况...这是可以产生所描述的行为的代码:

@interface GameScene()

@property (nonatomic, strong) SKAction *sound;
@end

@implementation GameScene

-(void)didMoveToView:(SKView *)view {
    self.sound = [SKAction playSoundFileNamed:@"sound1.wav" waitForCompletion:NO];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */
    [self runAction:self.sound];
}
@end

我知道有一些与此相关的问题,但给出的答案与解决方法有关。 我对解决方法不感兴趣,而是为什么会发生这种情况?它是否与 AVAudioSession 有关? (可能不是)我知道我可以使用 AVAudioPlayer 作为解决方法,但仍然不确定播放大量简单的短声音的性能有多少......

ios objective-c audio sprite-kit skaction
3个回答
2
投票

SKAction

playSoundFileNamed
在应用程序在后台和前台之间转换方面存在错误。这就是您遇到此问题的原因。我不确定这个问题是否已在 iOS 9 中得到纠正。

至于解决方法,您表示您不感兴趣,但为了完成目的,我将添加一个解决方法。使用 AVAudioPlayer 而不是 SKAction。 AVAP 能够根据您的应用程序的状态停止和启动(使用其委托)。


0
投票

这可能是混合音频的问题。我发现启用混合音频在中断、广告视频播放或应用程序后台运行期间不再停止 SpriteKit 的音频引擎。

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

0
投票

我面临与 playSoundFileNamed 相同的问题,即使用 SKAction.playSoundFileNamed 打电话后没有声音。

经过一番测试,我发现最小化应用程序并返回,执行此操作两次会返回音频。或者锁定和解锁手机两次也会返回。

我想知道 AVAudiosession 或音频引擎发生了什么,执行最小化/最大化应用程序两次可以解决此问题。过程中查看AVAudioSession的类别、模式变化,还是一样。 唯一的问题是,当我们接到电话大约 10 帧时,音频引擎没有运行,但随后它开始自动运行,并且 Playsoundfilenamed 上没有声音。

我们可以做些什么来处理中断,以便当它结束时,我们得到与第二次最小化、最大化时发生的相同的事情。 我本来想发表评论,但堆栈溢出需要 50 次才能做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.