我正在我的应用程序中使用 AVPlayer 从我的服务器播放音频。现在我希望当它完全缓冲音频时,我可以将该数据保存在应用程序中以便稍后播放。那么如何访问缓冲区数据并将其保存以备后用呢?
4 回答
您可以提供一个resourceLoader
委托来接管对资源加载过程的控制,AVPlayer
然后在请求和可用时向其提供数据。资源加载器是AVURLAsset
. 我在我的博客上记录了一个完整的解决方案,但主要思想是将您的 URL 协议切换为自定义的协议,因此 AVURLAsset 的资源加载器需要您的应用程序协助加载该 URL。然后,当您收到AVAssetResourceLoaderDelegate
回调时,开始下载文件并尝试在您有数据时响应从这些委托回调收到的待处理请求。这将允许渐进式加载/播放内容,而无需在您的应用程序中运行完整的 HTTP 服务器或诉诸其他复杂的解决方案。
容易做到...为您的音频流使用相同的 url 使用 NSURLConnection 获取数据并使用 NSFilehandler 保存...只是自己完成,同时流式传输音频并同时保存到 mp3...如果你告诉我需要代码示例...
Calm 的团队已经开源了我们的实现。它可以作为 CocoaPod 使用。它被称为PersistentStreamPlayer
。
它充当资源加载器。与其他实现相比的最大好处是它不需要二进制数据在任何时候都在内存中,因此它支持更大的文件。
特点包括:
- 音频文件的流式传输,一旦第一个数据可用就开始播放
- 缓冲区完成后,还会将流数据保存到文件 URL 暴露 timeBuffered,有助于在 UI 中显示缓冲区进度条
- 在缓冲流停止后处理重新启动音频文件(例如慢速网络)
- 简单的播放、暂停和销毁方法(销毁清除所有内存资源)
- 不将音频文件数据保存在内存中,因此它支持不适合 RAM 的大文件
你可以在这里找到它:https ://github.com/calmcom/PersistentStreamPlayer
您无法访问AVPlayer
. 一些提示:您可以将音频文件的预览(短版音频)放在服务器上,以便您的用户可以在下载完整音频文件之前收听预览,或者您可以搜索自定义开源音频流播放器,也许这些将允许您访问流缓冲区。祝你好运!