AVAudioPlayer 是 AVFoundation 框架中的一个类,专门用于播放音频文件(MP3、WAV、CAF 等)。
基本使用
1、导入 AVFoundation
import AVFoundation
2、创建 SoundManager(单例模式)
为了方便在整个 App 里播放音效,可以创建一个 SoundManager:
class SoundManager {
static let shared = SoundManager() // 单例
var player: AVAudioPlayer?
func playSound(named soundName: String) {
if let url = Bundle.main.url(forResource: soundName, withExtension: "mp3") {
do {
player = try AVAudioPlayer(contentsOf: url)
player?.play()
} catch {
print("播放失败: \(error.localizedDescription)")
}
} else {
print("找不到音效文件: \(soundName)")
}
}
}
3、确保音效文件已加入 Xcode
拖入 .mp3 或 .wav 文件 到 Xcode 项目的 Assets 目录(或直接放入 Bundle 目录)。
例如,音效文件名为 “place_block.mp3” 和 “clear_block.mp3”。
4、在 SwiftUI 中播放音效
Button("播放放置音效") {
SoundManager.shared.playSound(named: "place_block")
}
进阶用法
同时播放多个音效
默认 AVAudioPlayer 一次只能播放一个音效,如果想要多个音效同时播放,可以使用多个 AVAudioPlayer 实例:
class SoundManager {
static let shared = SoundManager()
var players: [AVAudioPlayer] = []
func playSound(named soundName: String) {
if let url = Bundle.main.url(forResource: soundName, withExtension: "mp3") {
do {
let player = try AVAudioPlayer(contentsOf: url)
player.play()
players.append(player) // 保持引用,防止音效被系统回收
} catch {
print("播放失败: \(error.localizedDescription)")
}
}
}
}
这样,可以同时播放多个音效,比如放置方块的音效不会被消除音效打断。
循环播放背景音乐
如果游戏有背景音乐,可以使用 numberOfLoops = -1 让音效无限循环:
class MusicManager {
static let shared = MusicManager()
var player: AVAudioPlayer?
func playBackgroundMusic() {
if let url = Bundle.main.url(forResource: "background_music", withExtension: "mp3") {
do {
player = try AVAudioPlayer(contentsOf: url)
player?.numberOfLoops = -1 // 无限循环
player?.play()
} catch {
print("背景音乐播放失败: \(error.localizedDescription)")
}
}
}
func stopBackgroundMusic() {
player?.stop()
}
}
控制音量
可以设置 volume 来控制音效音量:
player?.volume = 0.5 // 设置为 50% 音量
如果想要让背景音乐和音效有不同的音量:
SoundManager.shared.playSound(named: "place_block") // 音效
MusicManager.shared.playBackgroundMusic() // 背景音乐
检测播放状态
可以检测音效是否正在播放:
if player?.isPlaying == true {
print("音效正在播放")
} else {
print("音效已停止")
}
总结
使用AVAudioPlayer可以实现在应用中播放音频、音效,支持同时播放多个音频,也支持循环播放、音量控制和播放状态。
相关文章
Apple多媒体框架avfoundation:https://fangjunyu.com/2024/12/11/apple%e5%a4%9a%e5%aa%92%e4%bd%93%e6%a1%86%e6%9e%b6avfoundation/