首页 > 解决方案 > 如何在 Swift 中使用 AVAudioEngine 和 AVAudioPlayerNode 播放音频?

问题描述

我正在尝试使用 AVAudioEngine 和 AVAudioPlayerNode 播放音频。但是,在“engine.connect ...”中,我得到了这个:

“PlaySound[21867:535102] [AudioHAL_Client] AudioHardware.cpp:666:AudioObjectGetPropertyData: AudioObjectGetPropertyData: 没有给定 ID 0 的对象”

“engine.connect ...”之后的代码似乎在运行,因为它打印“buffer?.format”,但没有声音。

有人可以让我知道我错过了什么吗?这是我的测试代码。

let audioNode = AVAudioPlayerNode()
let path = Bundle.main.path(forResource: "Sounds/Test.mp3", ofType: nil)
let url = URL(fileURLWithPath: path!)
let file = try! AVAudioFile(forReading: url)
let buffer = AVAudioPCMBuffer(pcmFormat: file.processingFormat, frameCapacity: AVAudioFrameCount(file.length))
try! file.read(into:buffer!)
let engine = AVAudioEngine()
engine.attach(audioNode)
engine.connect(audioNode, to: engine.mainMixerNode, format: buffer?.format)
// PlaySound[21867:535102] [AudioHAL_Client] AudioHardware.cpp:666:AudioObjectGetPropertyData:  AudioObjectGetPropertyData: no object with given ID 0
engine.prepare()
try! engine.start()
audioNode.play()
audioNode.scheduleBuffer(buffer!, at: nil, options: .loops, completionHandler: nil)
debugPrint(buffer?.format)
// Optional(<AVAudioFormat 0x60000212d1d0:  1 ch,  44100 Hz, Float32>)

在engine.connect() 中,我还尝试了engine.outputNode.outputFormat(forBus: 0) 而不是buffer?.format。我没有运气。

标签: swiftavaudioengineavaudioplayernode

解决方案


如果我像这样将引擎放在外面,它会起作用:

class ViewController: NSViewController {
    let engine = AVAudioEngine()
    override func viewDidLoad() {

推荐阅读