gpt4 book ai didi

ios - 如何在 iOS 中流式传输电影并稍后从文件系统播放?

转载 作者:可可西里 更新时间:2023-11-01 04:23:54 26 4
gpt4 key购买 nike

我有一个应用程序,目前附带了所有可以播放的嵌入视频。这不能很好地扩展,除非您想播放所有电影,否则会浪费磁盘空间。这也降低了升级应用程序的可取性,因为您必须重新下载所有电影。

我想做的是即时下载电影,边下载边播放,然后如果下载成功,将其保存到文件系统中,以便下次他们想看时,从本地文件。

我可以对视频做任何需要的事情,但目前我正在将它作为来自 Amazon S3 的 .mp4 文件提供,mimetype 为 video/mp4,所以我的问题的前半部分工作正常:电影下载,MPMovieViewController 将在认为下载“足够”后立即开始播放。

有什么方法可以利用该视频文件的缓存,以便我可以保存它并控制它在文件系统中的驻留时间?这似乎是最简单的方法。

我的目标是 iOS 5+6,但如果唯一可用的解决方案需要 iOS 6,我也会考虑。谢谢!

更新:我认为使用 AFNetworking,我现在已经完成了一半。我正在从服务器下载视频文件,并监听下载进度。当我看到 25% 的视频已下载后,我开始使用 MPMoviePlayerController 播放本地文件。

我现在遇到的主要问题是播放似乎搞砸了。一切顺利,已下载 25%,开始播放...下载继续正常进行...然后文件完全下载完毕,此后不久视频卡住。屏幕上的播放计时器仍然指示播放正在进行,我没有看到任何“播放完成”类型的通知,但视频已卡住。基于该行为,我的猜测是可能用于视频播放的初始缓冲区已用完,并且它没有检测到磁盘上现在有更多视频可用?

有没有什么方法可以与 MPMoviePlayerController 交互,让它知道定期刷新正在播放的缓冲区?或者其他一些方法来处理这种情况?

最佳答案

更新:确保看到来自@TomHamming 的更新答案。

我还没有找到决定性的答案,但目前我相信答案是:你不能可靠地做到这一点。至少不是没有很多看起来太像 hack 的工作。我向 Apple 提交了一个功能请求,因为看起来这应该可以通过对 MPMoviePlayerController 进行一些调整来实现。

我将回顾我尝试过或考虑过的各种事情,以及我遇到的结果。

  • 向 MPMoviePlayerController 传递一个 URL 到您的电影文件,这允许它流式传输,然后将文件从保存它的缓存中拉出到您的本地文档文件夹中。赢了从 iOS 6 开始无法使用。我向 Apple 提交了功能请求,但就目前情况而言,您无法获取他们正在下载的文件,AFAIK。

  • 开始使用 NSURLConnection(或类似 AFNetwork 的东西)下载电影文件,然后当“相当数量”下载到设备时,将文件 URL 传递给 MPMoviePlayerController 并让它从磁盘。 有点工作,但不是很好。三个问题:

    • 很难知道何时开始播放文件。我还没有弄清楚 Apple 使用的算法,所以我总是谨慎行事,等待 25% 下载后再玩。

    • MPMoviePlayerController 接口(interface)不提供流媒体电影的感觉,就像 Apple 通过网络进行计算时那样。在用户看来文件已完全下载,但实际上并未下载。

    • 最重要的是,MPMoviePlayerController 似乎无法很好地播放未完全下载的文件。一旦文件下载完成,或者如果播放器 catch 了下载量,我就遇到了播放问题,但我从未找到一种优雅的方式来处理这些情况。

  • 与上述过程相同,但使用 AVFoundation 类可以更精细地控制播放过程,并避免上述有关播放停止等问题。可能有效,但我想要所有的MPMoviePlayerController 的功能。自己重新实现 MPMoviePlayerController 只是为了获得这个功能似乎是在浪费时间。

  • 与上述 #1 相同的过程,但在您的应用程序中运行一个小型网络服务器来处理将视频从磁盘流式传输到 MPMoviePlayerController,希望流式传输能够更好地工作就像直接从外部 Web 服务器流式传输文件时通常所做的那样。有效,但结果仍然零星,性能似乎受到影响。我用 CocoaHTTP 做了测试.我决定反对这种方法,因为它感觉就像一个可怕的 hack。

  • 运行轻量级 HTTP 代理,从而在下载的电影文件数据从互联网流式传输到您的 MPMoviePlayerController 时拦截它。不确定这是否有效。我还不能测试这个,因为我还没有找到一个用 Objective-C 编写的轻量级 HTTP 代理,而且在这一点上我不想仅仅为了尝试这个实验而实现一个。这似乎是所有这些技巧中下一个最容易实现的——如果您不必编写代理!

在这一点上,我决定采用不那么棘手但也不太用户友好的方法,即简单地完全下载文件,然后将其传递给 MPMoviePlayerController,直到出现更好的解决方案。

关于ios - 如何在 iOS 中流式传输电影并稍后从文件系统播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534395/

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