【问题标题】:Simultaneously stream and save a video?同时流式传输和保存视频?
【发布时间】:2010-10-28 18:41:21
【问题描述】:
我正在编写一个应用程序,其中一部分允许用户流式传输/播放视频。我想限制该功能,以便他们只能在有 WiFi 连接的情况下流式传输视频。然后我会保存视频,这样当他们只有 3G(或更小)连接时,他们就无法流式传输视频,只能重播手机上保存的视频。
理想情况下,我想让 MPMoviePlayerController 流式传输/播放电影,然后访问电影数据并保存它。但是,MPMoviePlayerController api 似乎不支持访问电影数据。
我想避免下载然后播放的场景。有什么想法吗?
【问题讨论】:
标签:
iphone
video-streaming
mpmovieplayercontroller
【解决方案1】:
iPhone 正在使用渐进式下载,因此它不会保存在设备上。为此,您需要明确下载它,然后从本地文件夹播放视频。
【解决方案2】:
想到了两个解决方案。
这两种解决方案都要求文件采用可以渐进式播放的格式,例如你不需要整个文件就可以播放它(但这无论如何都是先决条件)。
- 使用线程下载数据并将其附加到文件中,然后从另一个线程播放文件。现在,这要求您可以在 MPMoviePlayerController 中处理 EOF 事件并暂停播放,直到缓存文件被附加到,然后在同一点继续播放。
到目前为止,我看到人们这样做是行不通的,因为 MPMoviePlayerController 无法处理 EOF 事件。 (我自己还没有测试过)[Caching videos to disk after successful preload by MPMoviePlayerController
- 跳过文件的播放并设置本地 HTTP 服务器并从该服务器(在本地主机上)流式传输。这也没有经过测试。
这个想法是 MPMoviePlayerController 将更好地处理从 HTTP 流中丢失数据的事件,而不是直接读取文件。
缺点可能是效率较低,但我认为这是 CPU 的小幅增加。我不知道网络接口是否会处理它,但我认为这不是问题。
我将此答案保留为 wiki,因为我没有可行的解决方案,但我也想要一个。
【解决方案3】:
有一种方法可以完成这项工作,但您必须编写自己的 HTTP Live Streaming 下载器。
基本上,您解析 .m3u8 文件(这是一个非常简单的标准,但对于备用流可能会变得棘手,并且流可能会简单地退出并需要一个新的播放列表才能继续),然后以 .m3u8 格式下载块。 ts 格式到本地存储,比如 Documents 文件夹或 Caches 等。
然后您必须设置一个本地 HTTP 服务器以允许 MPMoviePlayerController 或 AVPlayer 通过 HTTP 访问文件(因为它们不会触及本地文件路径),包括一个重新编码的播放列表文件指向本地文件,您必须从原始播放列表自己创建。
CocoaHTTPServer 非常适合这个。
一旦你完成了所有这些,它就会工作得很好。在将本地 HTTP URL 呈现给电影播放器之前,您在下载前一两个块时不可避免地会有一点延迟,但之后您就可以无缝下载、录制和预览播放。
祝你好运!