如何在不加载完整缓冲区的情况下启动 AVAudioPlayer?

How to start AVAudioPlayer without loading full buffer?

我想用AVAudioPlayer播放以前录制的文件。该录音工作正常,我将文件保存到临时目录。

问题是,一旦我设置 AVAudioPlayer,它就会开始缓冲并 will not start playing before fully buffering 录音。现在它可能适用于大约 30 秒的录音,但我也希望它适用于 1 小时长的录音。我说的是 > 1 分钟的等待时间。

如何强制 AVAudioPlayer 从当前缓冲区开始播放? 就像我可以用 player.automaticallyWaitsToMinimizeStalling = false 告诉 AVPlayer 因为我不希望有任何拖延问题。

或者我如何从 AVPlayer 获得像 averagePower()->Float 这样的东西? 我无法使用 AVPlayer,因为我需要类似 AVAudioPlayerfunc averagePower(forChannel channelNumber: Int) -> Float 来显示录音的可视化演示。如果你知道如何从 AVPlayer、-Item、-Asset 或 -Track 获得那些 averagePower 值,那也很好,我找不到合适的东西。

我发现,如果你使用 AVAudioPlayer 但调用 player.play() on another thread,它不会等待缓冲区并立即开始播放。

DispatchQueue.global(qos: .background).async {
    self.player.play()
}

但这有一些限制,因为现在我 不能使用 player.play(at: TimeInverval) 因为这似乎会中断构建缓冲区然后文件将不会播放到其完整持续时间。 我通过在 player.play() 之前设置 player.currentTime 解决了这个问题,这不会影响缓冲区。