在Swift 4中播放一系列音频文件

时间:2017-12-02 15:32:30

标签: ios swift audio avaudioplayer

我正在开发一个应用程序,我想播放一系列简短的音频片段,主要是非常短的句子。 (口头指示)并一个接一个地播放。

我创建了一个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发生的,还是由于音频播放滞后?有没有人遇到同样的问题?或者有更好的方法来解决这个问题吗?

提前致谢!

0 个答案:

没有答案