【发布时间】:2020-12-12 21:55:09
【问题描述】:
使用 AVFoundation 和 AVAudioPlayerNode 通过 Xcode 版本 9.2 (9C40b) 播放声音并部署到 iOS 11.2
问题是当你改变音量时,在你第一次播放声音时并没有应用改变,还有其他奇怪的效果。
在 Xcode 中启动一个新项目,选择 iOS Game,然后给任何名称。然后将 GameScene.swift 中的代码替换为:
import SpriteKit
import GameplayKit
import AVFoundation
class GameScene: SKScene {
var entities = [GKEntity]()
var graphs = [String : GKGraph]()
let audioFilePlayer = AVAudioPlayerNode()
var audioFile:AVAudioFile! = nil
var audioFileBuffer:AVAudioPCMBuffer! = nil
override func sceneDidLoad() {
do {
let path = Bundle.main.path(forResource: "sound", ofType: "caf")!
let url = URL(fileURLWithPath: path)
audioFile = try AVAudioFile(forReading: url)
audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFile.processingFormat, frameCapacity: UInt32(audioFile.length))
try audioFile.read(into: audioFileBuffer!)
audioEngine.attach(audioFilePlayer)
audioEngine.connect(audioFilePlayer, to: audioEngine.mainMixerNode, format: audioFileBuffer?.format)
try audioEngine.start()
}
catch {
print(error)
}
let playAction = SKAction.sequence([
SKAction.wait(forDuration: 3.0),
SKAction.run { self.play(volume: 1.0) },
SKAction.wait(forDuration: 1.0),
SKAction.run { self.play(volume: 1.0) },
SKAction.wait(forDuration: 1.0),
SKAction.run { self.play(volume: 0.0) },
SKAction.wait(forDuration: 1.0),
SKAction.run { self.play(volume: 0.0) },
SKAction.wait(forDuration: 1.0),
SKAction.run { self.play(volume: 1.0) },
SKAction.wait(forDuration: 1.0),
SKAction.run { self.play(volume: 1.0) },
])
self.run(playAction)
}
func play(volume:Float) {
print("playing at \(volume)")
audioFilePlayer.stop()
audioFilePlayer.volume = volume
audioFilePlayer.scheduleFile(audioFile, at: nil, completionHandler: nil)
audioFilePlayer.play()
}
}
为糟糕的选项道歉...另外,在项目中添加一个名为 sound.caf 的声音文件。
控制台输出是:
playing at 1.0
playing at 1.0
playing at 0.0
playing at 0.0
playing at 1.0
playing at 1.0
我希望听到:响亮,响亮,没有,没有,响亮,响亮。
我实际上在听到:响亮,响亮,响亮,没有,轻柔,响亮
(“软”特别怪)
我也尝试过更改主音量:
audioEngine.mainMixerNode.outputVolume = volume
但声音是一样的。
在较早的游戏中,曾经使用 OpenAL,但这需要 Obj-C 并且与桥接头等相当混乱。此外,据说不再支持 OpenAL。基于 SKAction 的音频无法处理大量快速重复的声音而不会出现故障和划痕(这是一款太空射击游戏……)模拟器和设备上的问题是相同的。任何帮助表示赞赏!
【问题讨论】:
标签: ios swift sprite-kit