在学习英语小助手里,我准备为它加入一个读出发音的功能。读出发音时应该能有正常语速和慢速发音。这里记录一下这个简单的播放处理。
首先我们需要AVKit
import AVKit
在你的View里需要一个AVAudioPlayer
@State var audioPlayer: AVAudioPlayer!
需要初始化这个audioPlayer
if let audioURL = Bundle.main.url(forResource: "file", withExtension: "wav"){
audioPlayer = try! AVAudioPlayer(contentsOf: audioURL)
audioPlayer.enableRate = true
audioPlayer.prepareToPlay()
}
最后就可以调用它来做播放了:
ZStack{
VStack {
Text("Play").font(.system(size: 45)).font(.largeTitle)
HStack {
Spacer()
Button(action: {
audioPlayer.currentTime = 0
audioPlayer.rate = 0.5
audioPlayer.play()
}) {
Image(systemName: "play.fill").resizable()
.frame(width: 50, height: 50)
.aspectRatio(contentMode: .fit)
}
Spacer()
Button(action: {
audioPlayer.currentTime = 0
audioPlayer.rate = 1
audioPlayer.play()
}) {
Image(systemName: "play.circle.fill").resizable()
.frame(width: 50, height: 50)
.aspectRatio(contentMode: .fit)
}
Spacer()
Button(action: {
self.audioPlayer.pause()
}) {
Image(systemName: "stop.circle.fill").resizable()
.frame(width: 50, height: 50)
.aspectRatio(contentMode: .fit)
}
Spacer()
}
}
}
有关播放控制:
- 播放 : 实例直接调用 play 方法就可以实现开始播放, 苹果推荐在调用play之前先调用prepareToPlay方法, 此方法会在播放之前预处理和预加载音频文件, 以减少播放延迟, 如果不调用此方法也可以正常播放,prepareToPlay方法也会隐式调用,但是会有些许延迟.
- 停止: 实例调用pause 和 stop都会停止当前播放, 再调用play 也都会继续播放音频, 但是stop方法会撤销prepareToPlay 方法中做的一些准备工作.
- 进度控制: currentTime属性,改属性控制着播放进度, 如果音频正在播放,音频将偏移到指定的进度, 如果音频没在播放状态, currentTime决定着开始播放的进度.
- 循环次数: numberOfLoops属性决定着音频的重复播放次数,默认值是0, 意味着只会播放一遍, 如果值我们设置为1, 那么会播放2遍, 以此类推,如果我们设置为一个负数, 那么将一直重复播放,直到我们手动停止.
- 音量控制:volume属性, 赋值范围是从0.0-1.0, float类型数据.
- 速度控制:rate属性是控制音频播放速率, 赋值范围0.5-2.0之间. 1.0为正常, 0.5为半速播放, 2.0为2倍速播放. 在使用rate属性之前,应先设置enableRate属性为YES 激活rate,并且必须在prepareToPlay之前调用.
相关的playground可以在这里取得