【问题标题】:Loading cached remote audio files to AKPlayer on iOS, instead of using local file将缓存的远程音频文件加载到 iOS 上的 AKPlayer,而不是使用本地文件
【发布时间】:2018-09-20 15:16:44
【问题描述】:

到目前为止,我一直在使用AKPlayers 进行多音频播放项目,由AKSequencer 触发,以获得完美的同步、循环和高级信号处理。进展顺利,但现在我需要一些洞察力才能进入下一个级别。

我正在尝试使用远程 mp3 文件播放完全相同的功能 - 从远程 URL 地址流式传输 mp3 文件数组。但是,AKPlayer 目前似乎还不支持流式传输功能。

不过,我在这个网站上发现的一种可能性是 Ryan Francesconi 在线程 "How can I get AudioKit to stream an audio file from a remote URL?” 上的回答。以下是他的建议:

guard let remote = URL(string: "https://www.sample-videos.com/audio/mp3/crowd-cheering.mp3"),

let data = NSData(contentsOf: remote) else {
AKLog("Remote failed to load.")
return
}

let cachedFile = FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(remote.lastPathComponent)
try? data.write(to: cachedFile)
let player = AKPlayer(url: cachedFile)


那么,在我开始试验之前,是否有人(最好是 Francesconi 先生)告诉我如何在 iOS 上实现此代码?使用这种缓存和加载的想法开发多音频文件播放项目是否安全(在无缝同步和循环方面)?如果我能更多地了解这一点,那将非常有帮助。非常感激。

【问题讨论】:

  • 我认为只要你的应用程序有权将文件保存到临时位置,这应该是相同的想法。

标签: swift audio-streaming audiokit


【解决方案1】:

就术语而言,这甚至不是一个缓存,因为缓存被认为是临时存储(如果 iOS 系统认为它是最好的,它会被删除),而这种方法实际上可以保存数据进入文件系统。一般来说,我认为预下载然后使用下载的文件的想法没有太多风险,因为您正在使用文件系统并且它非常快。

我唯一真正关心的是下载文件占用的空间。当应用处于非活动状态时,您可能需要清除临时文件(如果它们是临时文件)以避免内存问题。

为了更好地了解您的文件的存储方式和最重要的位置,请参阅Apple filesystem docs.

【讨论】:

  • 感谢您的评论,inokey。看起来我必须将音频文件下载到 temp/ 文件夹并在应用程序处于非活动状态时将其删除。我仍在逐步学习 Swift,看起来这将是另一个挑战。如果可能的话,你能否给我看一个基本的下载和加载代码的例子?我特别不明白如何在特定目录部分声明'cachedFile'。对不起,我是新手。
  • 例如,FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(remote.lastPathComponent) 似乎不适用于 iOS。有其他选择吗?
  • @Gavin 首先,如果正在下载的文件真的是临时文件,您需要回答这个问题。这当然很大程度上取决于您的应用程序的业务逻辑。如果它们是临时的,您实际上可以使用NSCache 默认使用缓存机制,并再次与您放入缓存中的项目的大小相关。如果文件不是临时文件,意味着应用程序会一遍又一遍地将它们用作资源,您可以使用文件管理器。
  • 肯定是缓存,因为目标音频每次都会更改/更新。我想知道您是否可以给我一个使用NSCache 保存远程文件并加载它的简短示例?非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多