我试图找出为什么 playSoundFileNamed 在连续接到两个电话后不起作用。实际上,它只有在接到第一个电话后才起作用。重现步骤是:
此后,播放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 作为解决方法,但仍然不确定播放大量简单的短声音的性能有多少......
SKAction
playSoundFileNamed
在应用程序在后台和前台之间转换方面存在错误。这就是您遇到此问题的原因。我不确定这个问题是否已在 iOS 9 中得到纠正。
至于解决方法,您表示您不感兴趣,但为了完成目的,我将添加一个解决方法。使用 AVAudioPlayer 而不是 SKAction。 AVAP 能够根据您的应用程序的状态停止和启动(使用其委托)。
这可能是混合音频的问题。我发现启用混合音频在中断、广告视频播放或应用程序后台运行期间不再停止 SpriteKit 的音频引擎。
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
我面临与 playSoundFileNamed 相同的问题,即使用 SKAction.playSoundFileNamed 打电话后没有声音。
经过一番测试,我发现最小化应用程序并返回,执行此操作两次会返回音频。或者锁定和解锁手机两次也会返回。
我想知道 AVAudiosession 或音频引擎发生了什么,执行最小化/最大化应用程序两次可以解决此问题。过程中查看AVAudioSession的类别、模式变化,还是一样。 唯一的问题是,当我们接到电话大约 10 帧时,音频引擎没有运行,但随后它开始自动运行,并且 Playsoundfilenamed 上没有声音。
我们可以做些什么来处理中断,以便当它结束时,我们得到与第二次最小化、最大化时发生的相同的事情。 我本来想发表评论,但堆栈溢出需要 50 次才能做到这一点。