2009-05-25 76 views
17

我正在写一个应用程序,其中的一部分允许用户流/播放视频。我想限制功能,以便他们只有在有WiFi连接的情况下才能播放视频。然后,我会保存视频,以便当他们只有3G(或更少)连接时,他们不能流式传输视频,并且只能播放保存在手机上的视频。同时流式传输并保存视频?

理想情况下,我想让MPMoviePlayerController流/播放电影,然后访问电影数据并保存它。但是,MPMoviePlayerController api似乎不支持对电影数据的访问。

我想避免和下载然后播放场景。有任何想法吗?

+0

嗨,你有成功吗? – Bkillnest 2016-03-15 02:23:06

回答

11

想到两种解决方案。 这两种解决方案都要求文件的格式可以逐行播放,例如,你不需要整个文件就可以播放它(但是无论如何这将是一个先决条件)。

  1. 使用线程下载数据并将其附加到文件,并从另一个线程播放文件。现在,这需要您可以处理MPMoviePlayerController中的EOF事件,并暂停播放,直到缓存文件被追加到然后恢复为同一点为止。

到目前为止,我所看到的人们这样做不起作用,因为MPMoviePlayerController无法处理EOF事件。 (未经我自己测试)[Caching videos to disk after successful preload by MPMoviePlayerController

  1. 从文件中跳过播放并设置本地HTTP服务器和来自(在本地主机上)的流。这也没有经过测试。 这个想法是,MPMoviePlayerController会更好地处理从HTTP流丢失数据的事件,然后直接读取文件。 下滑可能是效率不高,但我认为这是CPU的小幅增加。我不知道网络接口是否可以处理它,但我认为这不是问题。

我离开这个答案作为一个维基,因为我没有一个工作解决方案,但我也想要一个。

+2

有人试过这个吗?你有成功吗? – calimarkus 2012-08-29 21:01:56

1

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

2

有一种方法可以完成这项工作,但您必须编写自己的HTTP Live Streaming下载程序。

基本上,你解析的.m3u8文件(这是一个非常简单的标准,但可以变得棘手的备用流和流的可能性会简单地退出,需要一个新的播放列表继续),然后下载块.ts格式到您的本地存储,比如文档文件夹或Caches等。

然后,您必须设置本地HTTP服务器,以允许MPMoviePlayerController或AVPlayer通过HTTP访问文件(因为它们不会触摸本地文件路径),包括指向本地文件的重新编码的播放列表文件,您必须从原始播放列表创建自己的文件。 CocoaHTTPServer对此非常有用。

一旦你完成了所有的工作,它会很好。在将本地HTTP URL呈现给电影播放器​​之前,在下载第一个或第二个块之前,您不可避免地会出现一些延迟,但在此之后,您将无缝下载,录制和预览播放。

祝你好运!