AVPlayer和AVURLAssets的渐进式video下载

我们正在开发一个应用程序,需要通过AVPlayer播放video文件。 这些文件需要存储在用户的设备上,而且还必须在下载时播放。

目前我们已经构build了一个下载模块,它使用ASIHTTPRequest库通过PHP获取video文件(我们不希望媒体可以通过公共URL链接),并将它们asynchronous写入磁盘。

然后根据AV Foundation编程指南设置AVPlayer,使用AVURLAsset获取文件,使用资产制作AVPlayerItem,使用AVPlayer生成项目,然后将播放器设置为AVPlayerLayer。 播放器运行正常,完全下载的video文件,也将在模拟器中完美运行逐步下载的文件。

不幸的是,在实际的设备上,播放器的行为发生了变化,反而看起来像载入一次video,而不会尝试从磁盘抓取新的数据包。 结果是播放器将播放video和audio直到video中标记下载进度是在资产被加载的时间点 (例如,如果2MB的数据被缓冲,那么播放器被创build,播放器将只玩到2MB的数据)。 由于它具有video的标题,因此播放器会高兴地继续认为它正在播放video的整个持续时间,但是没有其他video呈现在屏幕上。

最后的一个问题是,如果video被插入到AVComposition中,并且AVPlayer被创build,那么渐进video将会播放正常。 这将是一个很好的解决scheme(无论如何我们的应用程序有时是必要的),除了我们的应用程序的客户端需要video可以通过AirPlay播放的Apple TV,这AVCompositions是不能的。

有谁知道是否有一种方法可以使用AVURLAssets构build的AVPlayer逐步下载video文件? 有没有办法强制播放器/ playerItem从AVURLAsset读取磁盘的方式似乎与AVComposition,而不是看起来caching在内存中的video?

谢谢!

我没有一个解决scheme,只是使AVURLAssets工作,但我使用了一个稍微不同的方法。 我们将我们的应用与CocoaHTTPServer捆绑在一起,并通过对本地服务器的HTTP请求播放未完全下载的video文件。

服务器知道文件的总长度,然后可以通过查看HTTP-Headers来确定文件的哪个部分是请求的,并且从磁盘或从远程源加载它。

在那里总是发起3个初始请求,其中一个是文件的前两个字节,另一个是从文件开始的一个较大的块,以及一个直接在文件结尾的块。 这就是为什么总是需要直接从远程服务器加载最后一部分,因为玩家从一开始就需要它。 我猜想本地文件也会发生同样的情况,所以玩家从文件中加载最后一个字节(不是正确的最后一个字节),并且不会播放该长度。

您将不得不inheritanceHTTPConnection并通过查看提供的“HTTPAsyncFileResponse”来创build自己的HTTPResponse类。

我希望这给你一个想法如何用不同的方法来实现这一点。