首页 文章

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

提问于
浏览
11

我们正在努力通过AVPlayer提供视频文件播放 . 文件需要存储在用户的设备上,但也必须在下载时播放 .

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

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

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

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

Does anyone know if there is a way to play progressively downloading video files using an AVPlayer built from AVURLAssets? 有没有办法强制播放器/ playerItem使用AVURLAsset从磁盘读取,就像它看起来像AVComposition一样,而不是看似在内存中缓存视频?

谢谢!

1 回答

  • 6

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

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

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

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

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

相关问题