下面是一个使用AVAudioEngine播放/循环音频的示例解决方案。这个示例中有两个按钮,一个用于播放音频,一个用于停止音频。
首先,导入AVFoundation和AVKit框架:
import AVFoundation
import AVKit
然后,创建一个AVAudioEngine实例和一个AVAudioPlayerNode实例:
var audioEngine = AVAudioEngine()
var audioPlayerNode = AVAudioPlayerNode()
接下来,创建一个AVAudioFile实例,用于加载并播放音频文件:
var audioFile: AVAudioFile!
func loadAudioFile() {
let audioFilePath = Bundle.main.path(forResource: "audio", ofType: "mp3")!
let audioFileURL = URL(fileURLWithPath: audioFilePath)
do {
audioFile = try AVAudioFile(forReading: audioFileURL)
} catch {
print("Error loading audio file: \(error)")
}
}
然后,设置AVAudioEngine的输入和输出:
func setupAudioEngine() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.playback)
try audioSession.setActive(true)
} catch {
print("Error setting up audio session: \(error)")
}
let mixer = audioEngine.mainMixerNode
audioEngine.attach(audioPlayerNode)
audioEngine.connect(audioPlayerNode, to: mixer, format: mixer.outputFormat(forBus: 0))
}
接下来,创建两个按钮,一个用于播放音频,一个用于停止音频:
@IBAction func playButtonPressed(_ sender: UIButton) {
playAudio()
}
@IBAction func stopButtonPressed(_ sender: UIButton) {
stopAudio()
}
在playButtonPressed方法中,我们可以使用AVAudioEngine播放音频:
func playAudio() {
if !audioEngine.isRunning {
loadAudioFile()
setupAudioEngine()
do {
try audioEngine.start()
} catch {
print("Error starting audio engine: \(error)")
}
audioPlayerNode.scheduleFile(audioFile, at: nil, completionHandler: nil)
audioPlayerNode.play()
} else {
if !audioPlayerNode.isPlaying {
audioPlayerNode.play()
}
}
}
在stopButtonPressed方法中,我们可以停止音频的播放:
func stopAudio() {
audioPlayerNode.stop()
audioEngine.stop()
audioEngine.reset()
}
最后,记得在适当的地方调用stopAudio方法停止音频的播放。
希望这个示例可以帮助你理解如何使用AVAudioEngine播放/循环音频,并在多个按钮中处理音频播放。