17

我正在编写一个应用程序,其中一部分允许用户流式传输/播放视频。我想限制该功能,以便他们只能在有 WiFi 连接的情况下流式传输视频。然后我将保存视频,这样当他们只有 3G(或更小)连接时,他们无法流式传输视频,只能重播手机上保存的视频。

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

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

4

3 回答 3

11

想到了两个解决方案。这两种解决方案都要求文件采用可以渐进式播放的格式,例如,您不需要整个文件就可以播放它(但这无论如何都是先决条件)。

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

到目前为止,我看到人们这样做是行不通的,因为 MPMoviePlayerController 无法处理 EOF 事件。(我自己还没有测试过)[ MPMoviePlayerController 成功预加载后将视频缓存到磁盘

  1. 跳过文件播放并设置本地 HTTP 服务器并从中流式传输(在 localhost 上)。这也没有经过测试。这个想法是 MPMoviePlayerController 将更好地处理从 HTTP 流中丢失数据的事件,而不是直接读取文件。缺点可能是效率较低,但我认为这是 CPU 的小幅增加。我不知道网络接口是否会处理它,但我假设这不是问题。

我将此答案保留为 wiki,因为我没有可行的解决方案,但我也想要一个。

于 2009-10-07T21:39:54.260 回答
2

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

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

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

一旦你完成了所有这些,它就会很好用。在将本地 HTTP URL 呈现给电影播放器​​之前,下载前一两个块时不可避免地会有一点延迟,但在那之后,您将获得无缝下载、录制和预览播放。

祝你好运!

于 2013-04-07T12:07:49.977 回答
1

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

于 2009-08-29T14:20:57.293 回答