我正在开发一个应用程序,我想播放一系列简短的音频片段,主要是非常短的句子。 (口头指示)并一个接一个地播放。
我创建了一个init函数,我将音频加载到AVAudioPlayer
中,准备播放并将其附加到数组中供以后使用。
func initAudioFiles () {
for audioFile in self.audioFiles {
let urlPath = Bundle.main.path(forResource: audioFile, ofType: "mp3")!
let fileURL = URL(fileURLWithPath: urlPath)
do {
let avAudioPlayer = try AVAudioPlayer.init(contentsOf: fileURL)
avAudioPlayer.prepareToPlay()
self.avAudioPlayers.append(avAudioPlayer)
}
catch { }
}
}
后来,我想播放一系列音频
'hello', 'your timer is set to', '1', 'minute', 'and', '1', 'hour'
。
请注意,AVQueuePlayer
无法正常工作,因为有两个相同的音频有可能排队。
所以我创建了以下脚本来一个接一个地播放它们。
for avAudioPlayerIndex in avAudioPlayerIndexes {
let avAudioPlayer = self.avAudioPlayers[avAudioPlayerIndex]
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(currentDeadline)) {
avAudioPlayer.play()
print("playing \(avAudioPlayer.play)")
// when the audio is played, reset and prepare it!
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(Int(avAudioPlayer.duration * 1000)) + .seconds(1)) {
avAudioPlayer.currentTime = 0
avAudioPlayer.pause()
avAudioPlayer.prepareToPlay()
}
}
// add its duration to the current deadline counter
let audioDurationMS = Int (avAudioPlayer.duration * 1000)
currentDeadline += audioDurationMS
}
创建一个Dispatch队列,其中所有音频在最后一个持续时间之后排队。当我打印所有排队时间时,它们至少相隔一秒钟。但是在运行代码时,每个音频文件的“播放...”print
非常关闭。特别是当重复先前播放的声音时,一些音频文件同时播放。这总是以同样的方式发生。
任何解决方案?这可能是由DispatchQueue发生的,还是由于音频播放滞后?有没有人遇到同样的问题?或者有更好的方法来解决这个问题吗?
提前致谢!