Swift中AVAudioEngine无法按Apple文档正常工作问题求助
解决AVAudioEngine无声音输出的问题
你的代码存在几个关键问题导致音频无法正常播放:
1. 核心问题:音频实例被提前销毁
audioEngine和playerNode是azAEngine()函数内的局部变量,函数执行完毕后这两个实例会被系统立即回收,根本来不及完成音频播放流程。必须将它们声明为类的属性,确保在播放全程保持存活状态。
2. Playground环境需持续运行
Playground默认代码执行完毕就会终止,不会等待音频播放完成。需要添加代码让Playground保持运行状态,直到播放结束。
3. 强制解包的隐患(非无声直接原因,但需修正)
你用try!和强制解包!加载音频文件,一旦文件路径错误会直接崩溃,建议用安全的可选绑定和错误处理替代。
修改后的完整代码
import AVFoundation import PlaygroundSupport // 让Playground持续运行,等待音频播放完成 PlaygroundPage.current.needsIndefiniteExecution = true class AudioPlayer { // 将音频引擎和播放器节点声明为类属性,保证实例存活 private let audioEngine = AVAudioEngine() private let playerNode = AVAudioPlayerNode() func playAudio() { guard let filePath = Bundle.main.path(forResource: "bluesuedeshoes", ofType: "mp3"), let audioFile = try? AVAudioFile(forReading: URL(fileURLWithPath: filePath)) else { print("音频文件加载失败") return } audioEngine.attach(playerNode) // 使用文件原始格式连接节点,避免格式不兼容问题 audioEngine.connect(playerNode, to: audioEngine.outputNode, format: audioFile.fileFormat) playerNode.scheduleFile(audioFile, at: nil, completionCallbackType: .dataPlayedBack) { _ in print("播放完成") // 播放结束后停止引擎并终止Playground self.playerNode.stop() self.audioEngine.stop() PlaygroundPage.current.finishExecution() } do { try audioEngine.start() playerNode.play() print("开始播放") } catch { print("音频引擎启动失败:\(error.localizedDescription)") } } } // 初始化播放器并启动播放 let player = AudioPlayer() player.playAudio()
额外说明
如果是在App项目中使用,无需PlaygroundSupport相关代码,但同样要确保audioEngine和playerNode的实例不会被提前释放(比如声明为ViewController的属性)。
内容的提问来源于stack exchange,提问作者Andy Z
相关产品推荐
相关产品推荐

