AVAudioEngine 不播放声音

AVAudioEngine doesn't playback a sound

我正在尝试使用 AVAudioEngine 来播放 wav 文件。我尝试了几种不同的方法,但没有任何效果。

尝试 1

...
    private var audioEngine: AVAudioEngine = AVAudioEngine()
    private var mixer: AVAudioMixerNode = AVAudioMixerNode()
    private var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode()

    func Play1() {
        guard let filePath = Bundle.main.url(forResource: "testwav", withExtension: "wav", subdirectory: "res") else {
            print("file not found")
            return
        }
        
        print("\(filePath)")
        
        guard let audioFile = try? AVAudioFile(forReading: filePath) else{ return }
        
        let audioFormat = audioFile.processingFormat
        let audioFrameCount = UInt32(audioFile.length)
        guard let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: audioFrameCount)  else{ return }
        do{
            try audioFile.read(into: audioFileBuffer)
        } catch{
            print("over")
        }
        let mainMixer = audioEngine.mainMixerNode
        audioEngine.attach(audioFilePlayer)
        audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioFileBuffer.format)
        audioEngine.connect(mainMixer, to:audioEngine.outputNode, format: audioFileBuffer.format)
        try? audioEngine.start()
        audioFilePlayer.play()
        audioFilePlayer.scheduleBuffer(audioFileBuffer, at: nil, options:AVAudioPlayerNodeBufferOptions.loops)
    }
...

尝试 2

...
    private var audioEngine: AVAudioEngine = AVAudioEngine()
    private var mixer: AVAudioMixerNode = AVAudioMixerNode()
    private var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode()

    func Play2() {
        DispatchQueue.global(qos: .background).async {
            self.audioEngine.attach(self.mixer)
            self.audioEngine.connect(self.mixer, to: self.audioEngine.outputNode, format: nil)
            // !important - start the engine *before* setting up the player nodes
            try! self.audioEngine.start()

            let audioPlayer = AVAudioPlayerNode()
            self.audioEngine.attach(audioPlayer)
            // Notice the output is the mixer in this case
            self.audioEngine.connect(audioPlayer, to: self.mixer, format: nil)
            
            guard let fileUrl = Bundle.main.url(forResource: "testwav", withExtension: "wav", subdirectory: "res") else {
                //            guard let url = Bundle.main.url(forResource: "audiotest", withExtension: "mp3", subdirectory: "res") else {
                print("mp3 not found")
                return
            }
            
            do {
                let file = try AVAudioFile(forReading: fileUrl)
                
                audioPlayer.scheduleFile(file, at: nil, completionHandler: nil)
                audioPlayer.play(at: nil)
            } catch let error {
                print(error.localizedDescription)
            }
        }
    }
...
...
    private var audioEngine: AVAudioEngine = AVAudioEngine()
    private var mixer: AVAudioMixerNode = AVAudioMixerNode()
    private var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode()

    func Play3() {
        DispatchQueue.global(qos: .background).async {
            self.audioEngine = AVAudioEngine()
            _ = self.audioEngine.mainMixerNode
            
            self.audioEngine.prepare()
            do {
                try self.audioEngine.start()
            } catch {
                print(error)
            }
            
            guard let url = Bundle.main.url(forResource: "testwav", withExtension: "wav", subdirectory: "res") else {
                //            guard let url = Bundle.main.url(forResource: "audiotest", withExtension: "mp3", subdirectory: "res") else {
                print("mp3 not found")
                return
            }
            
            let player = AVAudioPlayerNode()
            player.volume = 1.0
            
            do {
                let audioFile = try AVAudioFile(forReading: url)
                
                let format = audioFile.processingFormat
                print(format)
                
                self.audioEngine.attach(player)
                self.audioEngine.connect(player, to: self.audioEngine.mainMixerNode, format: format)
                
                player.scheduleFile(audioFile, at: nil, completionHandler: nil)
            } catch let error {
                print(error.localizedDescription)
            }
            
            player.play()
        }
    }
...

还应该提到没有错误,调试时我看到所有方法都已执行并且一切正常,但我听不到声音播放...

我做错了什么?

尝试使用以下 method 激活您的音频会话:

func setActive(_ active: Bool, options: AVAudioSession.SetActiveOptions = []) throws.

请注意,如果另一个活动音频会话的优先级高于您的(例如,phone 呼叫),并且两个音频会话都不允许混音,则尝试激活您的音频会话会失败。停用具有 运行 个音频对象的音频会话会停止它们,停用会话,并且 return 一个 AVAudioSession.ErrorCode.isBusy 错误。