【问题标题】:Simultaneously stream and save a video?同时流式传输和保存视频?
【发布时间】:2010-10-28 18:41:21
【问题描述】:

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

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

我想避免下载然后播放的场景。有什么想法吗?

【问题讨论】:

  • 嗨,你成功了吗?

标签: iphone video-streaming mpmovieplayercontroller


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    到目前为止,我看到人们这样做是行不通的,因为 MPMoviePlayerController 无法处理 EOF 事件。 (我自己还没有测试过)[Caching videos to disk after successful preload by MPMoviePlayerController

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

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

    【讨论】:

    • 我现在正在尝试这种方法。看起来它可以工作,但还没有运气。我正在使用来自该项目的带有HTTPAsyncDataResponse 的CocoaHTTPServer 分支:github.com/nickhart/CocoaHTTPServer
    【解决方案3】:

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

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

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

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 2018-04-04
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多