我们正在开发一款需要通过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有关,而不是看似在内存中缓存视频?
谢谢!
答案 0 :(得分:6)
我没有一个解决方案只是让它与AVURLAssets一起工作,但我使用的方法略有不同。我们将应用程序与CocoaHTTPServer捆绑在一起,播放未通过针对本地服务器的HTTP请求完全下载的视频文件。
服务器知道文件的总长度,然后可以通过查看HTTP-Headers来决定文件的哪一部分是请求,并从磁盘或远程源加载它。
在开发时总是有3个初始请求,一个用于文件的前两个字节,一个是文件开头的较大块,另一个是文件末尾的块。这就是为什么总是需要直接从远程服务器加载最后一部分,因为玩家从一开始就需要它。我猜对于本地文件也会发生同样的情况,因此播放器会从文件中加载最后一个字节(这些字节不是最后一个字节),并且不会播放该长度。
您必须通过查看提供的“HTTPAsyncFileResponse”来创建HTTPConnection的子类并创建您自己的HTTPResponse类。
我希望这能让您了解如何使用不同的方法来实现这一目标。