在iOS中首次使用AVAudioEngine播放声音

在iOS中首次使用AVAudioEngine播放声音,ios,avfoundation,avaudioengine,pitch-shifting,avaudioplayernode,Ios,Avfoundation,Avaudioengine,Pitch Shifting,Avaudioplayernode,我有一个声音文件,它听的是嘟嘟声,我必须反复播放这个声音,根据某些情况改变音高。我正在使用AVAudioEngine、AVAudioPlayerNode和AVAudioUnitTimePitch来实现这一目标。在我的视图中有两个按钮,即播放和停止。当我第一次按下播放按钮时,声音会反复播放,但在单击停止按钮一次,然后再次单击播放按钮后,声音不会播放,也不会出现错误。我一直在研究这个问题很长时间,但无法得到解决方案,我来到这里。你能帮我解决这个问题吗。或者我的问题还有其他的解决方案吗?我的代码如下:

我有一个声音文件,它听的是嘟嘟声,我必须反复播放这个声音,根据某些情况改变音高。我正在使用AVAudioEngine、AVAudioPlayerNode和AVAudioUnitTimePitch来实现这一目标。在我的视图中有两个按钮,即播放停止。当我第一次按下播放按钮时,声音会反复播放,但在单击停止按钮一次,然后再次单击播放按钮后,声音不会播放,也不会出现错误。我一直在研究这个问题很长时间,但无法得到解决方案,我来到这里。你能帮我解决这个问题吗。或者我的问题还有其他的解决方案吗?我的代码如下:

import UIKit
import AVFoundation

class ViewController: UIViewController {

    let engine = AVAudioEngine()
    let audioPlayer = AVAudioPlayerNode()
    let pitchUnit = AVAudioUnitTimePitch()

    var avAudioFile: AVAudioFile!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let path = Bundle.main.path(forResource: "Beep", ofType: "wav")!
        let url = NSURL.init(fileURLWithPath: path)
        avAudioFile = try? AVAudioFile(forReading: url as URL)

        setup()
    }

    func setup() {
        engine.attach(audioPlayer)
        engine.attach(pitchUnit)
        engine.connect(audioPlayer, to: pitchUnit, format: nil)
        engine.connect(pitchUnit, to:engine.mainMixerNode, format: nil)

        try? engine.start()

        audioPlayer.volume = 1.0
        audioPlayer.play()

    }
    @IBAction func playSound(_ sender: UIButton) {

        pitchUnit.pitch = 1

        // interrupt playing sound if you have to
        if audioPlayer.isPlaying {
            audioPlayer.stop()
            audioPlayer.play()
        }
        let buffer = AVAudioPCMBuffer(pcmFormat: avAudioFile.processingFormat, frameCapacity: AVAudioFrameCount(avAudioFile.length))
        try? avAudioFile.read(into: buffer!)
        audioPlayer.scheduleBuffer(buffer!, at: nil, options: AVAudioPlayerNodeBufferOptions.loops, completionHandler: nil)
    }

    @IBAction func stopSound(_ sender: UIButton) {
        audioPlayer.stop()
    }
}

问题在于您的playSound功能

// interrupt playing sound if you have to
if audioPlayer.isPlaying {
    audioPlayer.stop()
    audioPlayer.play()
}
只有当玩家已经在玩时,你才尝试玩它。所以这没有任何意义。您可以删除这些行,只需使用这些行即可

 audioPlayer.play()

总是一样的声音吗?你知道你不需要重新启动声音来改变音调。另外,您可能希望使用
pitchUnit.rate
而不是
pitch
,它是一个八度音阶的1200分之一。@rhyticfistman是的,它是相同的声音,但如果设备距离某个点大约在5米以内,它会播放嘟嘟声,当一个人离这个点越来越近时,它会增加音调或速率,当距离超过5米时,声音就会停止。当设备回到5米的范围内时,我遇到了重新启动声音的问题。