【问题标题】:Saving buffer data of AVPlayer保存 AVPlayer 的缓冲区数据
【发布时间】:2013-08-22 02:00:00
【问题描述】:

我正在我的应用程序中使用 AVPlayer 从我的服务器播放音频。现在我希望当它完全缓冲音频时,我可以将该数据保存在应用程序中以便稍后播放。那么如何访问缓冲区数据并保存以备后用呢?

【问题讨论】:

标签: iphone ios cocoa-touch avplayer


【解决方案1】:

您无法访问AVPlayer 的缓冲区。一些提示:您可以将音频文件的预览(短版音频)放在您的服务器上,以便您的用户可以在下载完整音频文件之前收听预览,或者您可以搜索自定义开源音频流播放器,也许这些将允许您访问流缓冲区。祝你好运!

【讨论】:

    【解决方案2】:

    很容易...为您的音频流使用相同的 url 使用 NSURLConnection 获取数据并使用 NSFilehandler 保存...只是自己完成,同时流式传输音频并同时保存到 mp3...让我知道您是否需要代码示例...

    【讨论】:

    • 是的,您可以为其他人分享代码,我已经完成了与您在答案中解释的相同的事情,并且效果很好。
    • 我们可以看看这个代码示例吗?也许是 Github 上的要点?
    • 你这样做不是下载了两次数据吗?我不会推荐
    【解决方案3】:

    您可以提供一个resourceLoader 委托来从AVPlayer 接管资源加载过程的控制权,然后在它请求并可用时向其提供数据。资源加载器是AVURLAsset 上的一个属性。我已经在我的blog 上记录了一个完整的解决方案,但主要思想是将您的 URL 协议切换为自定义的协议,因此 AVURLAsset 的资源加载器需要您的应用程序协助加载该 URL。然后,当您收到AVAssetResourceLoaderDelegate 回调时,开始下载文件并尝试在您有数据时响应从这些委托回调收到的待处理请求。这将允许渐进式加载/播放内容,而无需在您的应用中运行完整的 HTTP 服务器或诉诸其他复杂的解决方案。

    【讨论】:

    • 很好的答案!我正打算设置一个本地 http 服务器,该服务器有点充当代理,但这个解决方案似乎更优雅。一定会试一试的。
    • 您知道我必须进行哪些更改才能使其适用于视频文件吗?由于某种原因,播放器状态变为失败。我基本上只是插入了一个视频文件而不是 mp3 并添加了一个 avplayerlayer。下载开始,一切正常,但随后播放器的状态从 0(未知)变为 2(失败)
    • 不错!你遇到过这里描述的问题吗?我们遇到了同样的问题:stackoverflow.com/questions/29683567/…
    • 该代码适用于音频,但不适用于视频:(
    • 我知道这是一个老问题。不过,您可以在这里找到答案:stackoverflow.com/questions/37611488/…
    【解决方案4】:

    Calm 的团队已将我们的实现开源。它可以作为 CocoaPod 使用。它叫做PersistentStreamPlayer

    它充当资源加载器。与其他实现相比,最大的好处是它要求二进制数据在任何时候都在内存中,因此它支持更大的文件。

    功能包括:

    • 音频文件的流式传输,一旦第一个数据可用就开始播放
    • 缓冲区完成后,还会将流数据保存到文件 URL 暴露 timeBuffered,有助于在 UI 中显示缓冲区进度条
    • 在缓冲流停止后处理重新启动音频文件(例如慢速网络)
    • 简单的播放、暂停和销毁方法(销毁清除所有内存资源)
    • 不将音频文件数据保存在内存中,因此它支持不适合 RAM 的大文件

    你可以在这里找到它:https://github.com/calmcom/PersistentStreamPlayer

    【讨论】:

    • 它提到“通过 http 流式传输音频,并在缓冲时将数据保存到本地文件”它也适用于视频吗?
    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多