使用 AKPlayer 按顺序播放随机音频文件

Playing random audio files in sequence with AKPlayer

我正在从事一种多音频播放项目。首先,我在一个文件夹中有 10 个 mp3 文件。我希望 AKPlayer 随机播放其中一个音频文件,但按顺序播放 - 一个接一个。但是在另一个随机文件之后播放一个随机文件似乎很棘手。这是我写的:

let file = try? AKAudioFile(readFileName: String(arc4random_uniform(9)+1) + ".mp3")

let player = AKPlayer(audioFile: file!)

player1.isLoopiong = true
player.buffering = .always

AudioKit.output = AKPlayer

try? AudioKit.start()
player.start(at: startTime)

此代码永远循环第一个选择的随机文件 - 但我只是想播放每个随机文件一次。有什么办法可以重新加载 'file' 以便播放器在播放完毕后再次启动?我试过调用多个 AKPlayer(但调用 10 个播放器一定是错误的),if player.isPlaying = false,sequencer 等,但无法确切地弄清楚如何。为这样的新手问题道歉。非常感谢。

AKPlayer 有一个完成处理程序

to be called when Audio is done playing. The handler won’t be called if stop() is called while playing or when looping from a buffer.

完成处理程序类型是 AKCallback,它是 () -> Void 的类型别名。如果您有充分的理由不使用 10 AKPlayers,您可以使用完成处理程序来更改文件并重新启动播放器。但您也可以创建一个包含 10 AKPlayers 的数组,每个数组加载不同的文件,并具有随机选择播放器进行播放的功能(或循环播放预洗牌的数组)。数组中每个玩家的完成处理程序可以在适当的时候调用这个函数。根据上面引用的文档,确保 AKPlayer 没有循环,否则不会调用完成处理程序。

是的,您可以在播放结束时使用播放器的 completionHandler 将新文件加载到同一播放器中。在您的完成块中:

player.load(url: nextFile)
player.play()

另一种方法是将 AKClipPlayer 与 10 个预先确定的随机顺序的剪辑一起使用,并按顺序安排它们。这种方法将是最无缝的(如果重要的话)。