gpt4 book ai didi

swift - AudioKit 的 AKAudioFile 是否总是一次读取整个音频文件?

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:39 24 4
gpt4 key购买 nike

我的应用是适用于 macOS 的音频播放器,使用 AVAudioEngine 框架以 Swift 3 编写。

现在,我正在尝试利用 AudioKit 框架而不是直接使用 AVAudioEngine,因为它似乎是一个经过良好测试且值得信赖的框架(AudioKit 3.7.1(不是 4.x),因为我仍在使用 Swift 进行编码3)

在我当前的音频播放器实现中(没有 AudioKit),我一次读取一小块音频数据(5 到 15 秒之间),原因很明显 - 在播放或在轨道内搜索时立即开始播放,并且保持内存占用相当小。而且,我始终在内存中保留一个额外的“前瞻”缓冲区,以避免回放出现间隙。

因此,如果我改用 AudioKit,我希望它也能做同样的事情——理想情况下,我可以指定要使用的缓冲区大小,它会读取给定大小的音频数据 block 。但是,它似乎总是一次读取整个文件。对于需要响应并保持合理内存占用的音频播放器应用程序来说,这是不可行的。

假设我播放了 3 小时的有声读物 MP3……将整个文件读入内存需要 5 到 10 秒。所以用户必须等待很长时间才能开始播放轨道。并且内存使用量进入 GB 范围(即整个音频文件被加载到内存中)!这对我的应用程序(或任何音频播放器应用程序)来说是 Not Acceptable 。

附言我查看了 AudioKit 源代码,但找不到替代的 AKAudioFile 初始值设定项、AKAudioPlayer 中的设置或其他音频文件/播放器类来执行我想要的操作。

我错过了一些非常明显的事情吗?我是 AudioKit 的新手。我假设这是用于音频播放/合成的最流行的“高级”MacOS 框架。我无法想象它的开发人员会错过这么基本的东西?还是我的期望完全被误导了?

这是我的播放器代码的本质:

do {
let akFile = try AKAudioFile(forReading: track.file)
akPlayer = try AKAudioPlayer(file: akFile)

AudioKit.output = akPlayer
AudioKit.start()
akPlayer.start()

} catch {
print("Problem")
}

最佳答案

问题是 AKAudioPlayer(不是 AKAudioFile)只播放来自 Ram 的音频。正如 Aure 所说,要做的就是使用 AKPlayer。这目前仅在开发分支中,但默认情况下将从磁盘流式传输。

关于swift - AudioKit 的 AKAudioFile 是否总是一次读取整个音频文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com