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

标签 swift avfoundation avplayer avaudioplayer foundation

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

问题是,一旦我设置了 AVAudioPlayer,它就会开始缓冲,并且在完全缓冲之前不会开始播放该录音。现在它可以很好地处理大约 30 秒的录音,但我也希望它能够处理 1 小时长的录音。我说的是 > 1 分钟的等待。

如何强制 AVAudioPlayer 开始使用当前缓冲区播放? 就像我可以用 player.automaticallyWaitsToMinimizeStalling = false 告诉 AVPlayer 因为我预计不会出现任何停滞问题。

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

最佳答案

我发现,如果你使用AVAudioPlayer但在另一个线程上调用player.play(),它不会等待缓冲区并立即开始播放。

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

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

关于swift - 如何在不加载完整缓冲区的情况下启动 AVAudioPlayer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064919/

相关文章:

swift - URL 中的波斯字符(使用 Alamofire)

ios - 可视化点击 View ,显示点击指示器

ios - 如何使用 AVPlayer 更改视频播放质量?

ios - MTAudioProcessingTapGetSourceAudio 问题

ios - 如果没有在 block 内检测到 nil ?

ios - request.cancel() 用于重复使用的单元格 Alamofire swift

ios - 在 Swift 中获取复杂嵌套字典/数组组合的键值

ios - 为什么AVPlayer的初始加载如此缓慢?

iOS swift : Protocol and Types

iphone - AVCapture追加SampleBuffer