AVAudioPlayer 是 AVFoundation 框架中的一个类,专门用于播放音频文件(MP3、WAV、CAF 等)。
基本使用
1、导入 AVFoundation
import AVFoundation
2、在SwiftUI中使用
import AVFoundation
var player: AVAudioPlayer?
func playSound() {
guard let url = Bundle.main.url(forResource: "test", withExtension: "mp3") else { return }
do {
player = try AVAudioPlayer(contentsOf: url)
player?.prepareToPlay()
player?.numberOfLoops = 0
player?.volume = 1.0
player?.play()
} catch {
print("音频加载失败:\(error)")
}
}
3、确保音效文件已加入 Xcode
拖入 .mp3 或 .wav 文件 到 Xcode 项目的 Assets 目录(或直接放入 Bundle 目录)。
例如,音效文件名为 “place_block.mp3” 和 “clear_block.mp3”。
4、在 SwiftUI 中播放音效
Button("播放放置音效") {
playSound()
}
常用属性
1、isPlaying:布尔类型,表示是否正在播放。
2、duration:Double类型,音频总时长。
3、currentTime:Double类型,当前播放进度(可读写控制音频播放进度)。
4、volume:Float类型,音量 0.0 ~ 1.0。
5、pan:Float类型,左右声道平衡 -1.0 ~ +1.0。
6、numberOfLoops:Int类型,循环播放次数,-1表示无限循环。
7、enableRate:布尔类型,表示是否开启倍速播放。
8、rate:Float类型,1.0正常、0.5半速、2.0 2倍速,需要开启enableRate后,才能使用。
9、isMeteringEnabled:布尔类型,开启音量检测。
11、averagePower(forChannel: 0):平均功率(dB)。
12、peakPower(forChannel:0):峰值功率(dB)。
13、delegate = self:设置代理,监听播放结束。
常用方法
1、prepareToPlay():预加载,减少播放延迟。
2、play():播放。
3、pause():暂停。
4、stop():停止并重置时间为0.
5、play(atTime:1.0):指定时间点开始播放。
6、updateMeters(): 更新音量电平,用于波形动画数据。
代理(监听播放结束和错误)
class SoundManager: NSObject, AVAudioPlayerDelegate {
var player: AVAudioPlayer?
func setup() {
let url = Bundle.main.url(forResource: "test", withExtension: "mp3")!
player = try? AVAudioPlayer(contentsOf: url)
player?.delegate = self
player?.prepareToPlay()
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
print("播放结束")
}
func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {
print("解码错误:\(String(describing: error))")
}
}
总结
使用AVAudioPlayer可以实现在应用中播放音频、音效,支持同时播放多个音频,也支持循环播放、音量控制和播放状态。
AVAudioPlayer在实际应用中,首次播放音效可能会造成UI卡顿的场景,解决方案就是在应用入口设置预加载音效,具体解决方案《SwiftUI首次播放AVAudioPlayer导致卡顿的问题》。
免费音乐/音效网站
1、p1ixabay:https://pixabay.com/zh/
2、mixkit:https://mixkit.co/free-sound-effects/
3、freesound:https://freesound.org/
4、zapsplat:https://www.zapsplat.com/
相关文章
1、Apple多媒体框架avfoundation:https://fangjunyu.com/2024/12/11/apple%e5%a4%9a%e5%aa%92%e4%bd%93%e6%a1%86%e6%9e%b6avfoundation/
2、SwiftUI首次播放AVAudioPlayer导致卡顿的问题:https://fangjunyu.com/2025/03/16/swiftui%e5%ae%89%e8%a3%85%e5%90%8e%e9%a6%96%e6%ac%a1%e8%bf%90%e8%a1%8c%e5%87%ba%e7%8e%b0%e5%8d%a1%e9%a1%bf%e9%97%ae%e9%a2%98/
扩展知识
单例模式管理
iOS 可以通过创建单例模式,在整个 App 里播放音效:
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)")
}
}
}
