gpt4 book ai didi

ios - AVAudioPlayerNode 音量更改不会立即应用

转载 作者:搜寻专家 更新时间:2023-11-01 07:06:14 28 4
gpt4 key购买 nike

使用 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 并且桥接 header 等非常困惑。此外,据说不再支持 OpenAL。基于 SKAction 的音频无法处理大量快速重复的声音而不会出现故障和划痕(这是一款太空射击游戏......)问题在模拟器和设备上都是一样的。任何帮助表示赞赏!

最佳答案

好的,我找到了答案。音量更改后需要重置 AudioEngine,以便立即更改:

audioEngine.reset()

这个 play() 函数有效:

    func play(volume:Float) {
print("playing at \(volume)")
audioFilePlayer.volume = volume
audioEngine.reset()
audioFilePlayer.stop()
audioFilePlayer.scheduleFile(audioFile, at: nil, completionHandler: nil)
audioFilePlayer.play()
}

关于ios - AVAudioPlayerNode 音量更改不会立即应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47845376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com