使用AVURLAssets进行AVPlayer和逐行视频下载

Rob*_*all 11 progressive-download ios avplayer avcomposition avurlasset

我们正在开发一款需要通过AVPlayer播放视频文件的应用.文件需要存储在用户的设备上,但也必须在下载时播放.

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

然后我们根据AV Foundation Programming Guide设置AVPlayer ,使用AVURLAsset获取文件,使用资产制作AVPlayerItem,使用项目构建AVPlayer,然后将播放器设置为AVPlayerLayer.播放器在完全下载的视频文件中运行正常,并且还可以在模拟器中完美地运行逐步下载的文件.

不幸的是,在实际设备上,播放器的行为发生了变化,相反,它似乎只加载了一次视频而不会尝试从磁盘中获取新的数据包.结果是播放器将视频和音频播放到视频中的点,该点标记了资源加载时下载进度的位置(例如,如果缓冲了2MB的数据,则创建播放器,播放器将仅播放2MB的数据).因为它有视频的标题,播放器会很高兴地继续认为它在视频的整个持续时间内播放,但没有其他视频呈现在屏幕上.

最后一个问题是,如果将视频插入AVComposition并使用该视频创建AVPlayer,则渐进式视频将正常播放.这将是一个很好的解决方案(无论如何我们的应用程序都是必需的),除了我们的应用程序的客户端要求视频可以通过AirPlay在Apple TV上播放,AVCompositions无法播放.

有没有人知道是否有办法使用AVURLAssets构建的AVPlayer逐步下载视频文件?有没有办法强制播放器/ playerItem使用AVURLAsset从磁盘读取,就像它看起来像AVComposition一样,而不是看似在内存中缓存视频?

谢谢!

Sop*_*oph 6

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

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

在开发时总是有3个初始请求,一个用于文件的前两个字节,一个是文件开头的较大块,另一个是文件末尾的块.这就是为什么总是需要直接从远程服务器加载最后一部分,因为玩家从一开始就需要它.我猜想本地文件会发生同样的情况,因此播放器会加载文件中的最后一个字节(不是最后一个字节)并且不会播放该长度.

您必须通过查看提供的"HTTPAsyncFileResponse"来子类化HTTPConnection并创建您自己的HTTPResponse类.

我希望这能让您了解如何使用不同的方法来实现这一目标.