【问题标题】:Playing random audio files in sequence with AKPlayer使用AKPlayer按顺序播放随机音频文件
【发布时间】:2018-09-12 10:20:28
【问题描述】:

我正在开发一种多音频播放项目。首先,我在一个文件夹中有 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)

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

【问题讨论】:

    标签: audiokit


    【解决方案1】:

    AKPlayer 有一个完成处理程序

    在音频播放完毕时调用。处理程序不会被调用 如果在播放或从缓冲区循环时调用 stop()。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        相关资源
        最近更新 更多