Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AVAudioPlayerNode卷更改不会立即应用_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios AVAudioPlayerNode卷更改不会立即应用

Ios AVAudioPlayerNode卷更改不会立即应用,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,使用AVFoundation和AVAudioPlayerNode在Xcode 9.2版(9C40b)中播放声音,并部署到iOS 11.2 问题是,当你改变音量时,你第一次播放声音时就不会应用这种改变,还有其他一些奇怪的效果 在Xcode中启动一个新项目,选择iOS游戏,并给出任意名称。然后将GameSecene.swift中的代码替换为: import SpriteKit import GameplayKit import AVFoundation class GameScene: SKSce

使用AVFoundation和AVAudioPlayerNode在Xcode 9.2版(9C40b)中播放声音,并部署到iOS 11.2

问题是,当你改变音量时,你第一次播放声音时就不会应用这种改变,还有其他一些奇怪的效果

在Xcode中启动一个新项目,选择iOS游戏,并给出任意名称。然后将GameSecene.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的音频无法处理大量快速重复的声音,而不会出现小故障和划痕(这是一款太空射击游戏…),在模拟器和设备上的问题也是一样的。感谢您的帮助

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

audioEngine.reset()
函数的作用是:

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

是的,如果其他人感兴趣,我也通过在输入源和引擎之间添加一个AVAudioMixerNode解决了这个问题。mainMixerNode

如果我错了,请更正我,但您也可以只设置
audioFilePlayer.volume
而不触摸
重置,停止,或播放
,输出音量应立即更改。我的经验是,仅更改音量不会更改音量,除非您也进行了重置。。。这在新版本中可能已经改变,现在可能可以工作了。如果有,你应该添加一个答案。在2020年播放期间,仍然不能调整播放器节点的音量,Swift 5。停止播放、重置、调整音量,然后重新启动不是解决方案。。。然而,我确实找到了另一种选择。通过此链接了解如何在播放过程中进行调整。我需要调整我的均衡器设置。也许使用AVAudioEQ的珠藻糖蛋白方法可以帮助你@你能分享一下解决方案吗?不幸的是,我放弃了使用AVAudioEngine和使用节点的方法。但我认为,当我采用这种方法时,我使用AVAudioUnitEQ上的globalGain方法通过计时器执行淡入淡出。对不起,我帮不上什么忙了。