You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:38:22