AVAudioEngine 无法播放声音



我正在尝试使用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()
}
}
...

还应该提到的是,没有错误,而调试我看到所有的方法都被执行,一切正常,但我没有听到声音播放…

我做错了什么?

尝试使用以下方法激活音频会话:

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

请注意,如果另一个活动音频会话具有比您的更高的优先级(例如,一个电话),并且两个音频会话都不允许混音,尝试激活您的音频会话失败。取消激活有正在运行的音频对象的音频会话,会使它们停止,会话取消激活,并返回AVAudioSession.ErrorCode.isBusy错误。

最新更新