Swift SpriteKit如何在后台播放音频?

3

我有一个需要在后台播放音频的应用程序...

使用Swift和SpriteKit的SKActions是否可以实现这一点...

或者还有其他方式可以实现吗...

指点一下方向会非常有帮助。


以下的回答是否对您有帮助?如果是,请不要忘记将其标记为已接受 :) - lchamp
2个回答

6

SKAction非常易于与声音一起使用,但有时您可能需要更多的功能。

在这种情况下,您将希望使用AVAudioPlayer而不是SKAction

为了不编写自己的“播放器”,我建议您使用现有的播放器。这是我已经使用过的一个(SKTAudio):https://github.com/raywenderlich/SKTUtils/blob/master/SKTUtils/SKTAudio.swift

以下是如何使用它:

// For background audio (playing continuously)
SKTAudio.sharedInstance().playBackgroundMusic("yourBackgroundMusic.mp3") // Start the music
SKTAudio.sharedInstance().pauseBackgroundMusic() // Pause the music
SKTAudio.sharedInstance().resumeBackgroundMusic() // Resume the music

// For short sounds
SKTAudio.sharedInstance().playSoundEffect("sound.wav") // Play the sound once

正如您所看到的,您可以播放短音频(就像您可能已经使用SKAction做过的那样),甚至是背景音乐,它将循环播放,而您正在寻找。


我尝试使用那个库,但是当播放声音时,我的游戏仍然像地狱一样卡顿,为什么会这样????难道播放一个简单的声音需要这么多资源吗???? - msqar
@msqar 你是想播放背景音乐吗?确保它不是一个太大的文件。你是想播放一个声音效果吗?确保它是轻的。无论如何,重要的事情是只加载一次文件(最好在第一次播放之前)。你可以尝试使用SKAction / SKAudioNode来播放声音。此外,你也可以试试Xcode8 / iOS10 beta版本:有几个改进已经被做出。 - lchamp
我的音频文件非常小,大约只有80kb、100kb这样的大小,这个大小是否太大了?需要更小吗?此外,当我尝试让多个音频文件同时播放时,却无法实现,只有一个或没有声音。 - msqar

0

尝试了几种方法后,我偶然发现了一个合理的解决方案。要循环播放音乐,您可以设置一个SKAudioNode并将AutoPlayedLoop = true。然后在场景加载时调用“play music”方法。

现在,如果您想要一个声音效果,您也可以使用SKAudioNode。我发现声音效果开始重复,为了抵消这一点,我简单地创建了一个播放-停止序列。基本上,每次触发声音效果时,它都会运行此序列,因此,它只会按预期播放一次。然而,声音效果有一个截止时间,所以我创建了一个简单的颜色阴影方法,大约1秒钟,并将其添加到序列中。现在,序列产生的是play-shade-stop。每次声音效果运行此序列时,休眠的阴影动作会给它一个1秒钟的延迟,并允许它完全播放,然后它会像预期的那样停止。根据声音效果,您可以使用休眠的阴影动作进行必要的补偿,有时更长,有时更短。

好吧,这就是代码。它非常简单,您不需要为此创建整个AVPlayer类。

func playerhitfx() {
    let fx:SKAudioNode = SKAudioNode(fileNamed: "playerfx")
    let play: SKAction = SKAction.play()
    let stop: SKAction = SKAction.stop()
    let shade: SKAction = SKAction.colorize(with: UIColor.clear, colorBlendFactor: 1, duration: 1)
    let volume: SKAction = SKAction.changeVolume(to: 3, duration: 0)
    let seq: SKAction = SKAction.sequence([play,shade,stop])
    fx.run(seq)
    fx.run(volume)
    self.addChild(fx)


}

此外,您可以通过将所有音频设为AudioNodes来调整音量属性,以创建背景音乐和声音效果之间的良好音频混合,并发出某些其他效果。 希望这会有所帮助。
顺便说一下,您不能将SKAudioNode转换为AVAudioNode,这一点需要牢记。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接