同时流式传输和保存视频?

18

我正在编写一个应用程序,其中一部分允许用户流式播放视频。我想限制功能,使得只有在WiFi连接时他们才能流式播放视频。然后,我会保存视频,这样当他们只有3G或更低速度的连接时,他们就无法流式播放视频,只能重新播放保存在手机上的视频。

理想情况下,我希望使用MPMoviePlayerController来流式播放电影,然后访问电影数据并保存它。但是,MPMoviePlayerController api似乎不支持访问电影数据。

我希望避免下载-然后-播放的情况。有什么建议吗?


你好,你成功了吗? - Bkillnest
3个回答

12
我想到了两个解决方案。这两种解决方案都需要文件以可以渐进播放的格式存在,例如您不需要整个文件就可以播放它(但这将是一个先决条件)。
1、使用线程下载数据并将其追加到文件中,然后在另一个线程中播放该文件。现在,这要求您可以处理MPMoviePlayerController中的EOF事件,并暂停播放直到缓存文件被追加为止,然后从相同点继续播放。
到目前为止,我看到人们做到这一点是行不通的,因为MPMoviePlayerController无法处理EOF事件。(尚未进行测试)[通过MPMoviePlayerController成功预加载将视频缓存在磁盘上]
2、跳过从文件中播放并设置本地HTTP服务器并从中流式传输(在localhost上)。这也没有经过测试。 这个想法是MPMoviePlayerController会更好地处理从HTTP流而不是直接从文件中读取数据的丢失数据事件。 缺点可能是效率较低,但我认为CPU增加不大。我不知道网络接口能否处理它,但我假设这不是问题。
我把这个答案留作维基,因为我没有工作的解决方案,但我也想要一个。

我正在尝试这种方法。看起来它可能可以工作,但目前还没有运气。我正在使用CocoaHTTPServer的一个分支,其中包含来自此项目的“HTTPAsyncDataResponse”:https://github.com/nickhart/CocoaHTTPServer - vaughan

2
有一种方法可以实现这个,但是你需要编写自己的HTTP Live Streaming下载器。基本上,您需要解析.m3u8文件(它是一个相当简单的标准,但在备用流和流可能会突然中断并需要新的播放列表继续的情况下可能会变得棘手),然后下载以.ts格式为后缀的块到您的本地存储,例如文档文件夹或缓存等。
接下来,您需要设置本地HTTP服务器,以允许MPMoviePlayerController或AVPlayer通过HTTP访问文件(因为它们不会触及本地文件路径),包括重新编码的指向本地文件的播放列表文件,您需要从原始播放列表中创建自己的。 CocoaHTTPServer非常适合此操作。
完成所有这些步骤之后,它会很好地工作。在向电影播放器呈现本地HTTP URL之前,您不可避免地会在下载前两个块时出现一些延迟,但之后您将获得无缝下载、记录和预览回放。
祝你好运!

1

iPhone使用渐进式下载,因此不会保存在设备上。为此,您需要显式地下载它,然后从本地文件夹播放视频。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接