SwiftUI中通过AVAudioPlayer播放Audio小纸条

SwiftUI中通过AVAudioPlayer播放Audio小纸条

·

1 min read

在学习英语小助手里,我准备为它加入一个读出发音的功能。读出发音时应该能有正常语速和慢速发音。这里记录一下这个简单的播放处理。

首先我们需要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可以在这里取得