【问题标题】:AVPlayer - switching stream quality while playingAVPlayer - 播放时切换流质量
【发布时间】:2014-09-07 12:47:30
【问题描述】:

我正在使用 AVPlayer 播放 youtube 视频,对于每个 youtube 视频 ID,我都会检索几个不同质量的流 url。

我想根据网络状态播放特定的流质量。例如,如果用户使用 3G,我想播放质量最低的 URL,但如果用户移动到 wifi,我想无缝切换到质量更好的流。

这并不是什么新鲜事,youtube 正在他们的应用程序和许多其他应用程序中这样做。

所以我想知道用AVPlayer 进行这种切换的最佳方法是什么,我不希望用户尽可能注意到切换,而不暂停视频播放或缓冲。
有什么建议吗?

我不确定 youtube 服务器是否支持这种功能,或者我是否需要在客户端执行此功能。

【问题讨论】:

    标签: ios objective-c youtube avplayer


    【解决方案1】:

    您应该看看 Apple documentation 上的 HTTP 直播。

    实现您想要并在文档中讨论的切换类型的唯一方法是使用 m3u 索引文件和包含视频数据的 TS 文件。

    您连接到索引文件并存储其内容,这将是多个 URL 以及带宽要求。请参阅示例here。然后使用 Reachability 类检查网络状态并连接到适当的流。启动可达性通知程序并通过更改您连接到的流来响应事件。这将导致属于流的TS文件被下载并缓冲播放,实现你想要的切换类型。

    正如我之前所说,缺点是需要使用 TS 文件。这意味着您必须从 Youtube 下载视频文件,使用 Apple 提供的 mediafilesegmenter 命令行工具准备并存储在 FTP 服务器上!一点也不理想,但据我所知,这是唯一的方法。

    【讨论】:

      【解决方案2】:

      查看AVPlayer replaceCurrentItemWithPlayerItem: 方法。如果我是你,我会使用Reachbility 来观察用户的网络状态。当网络可达性下降时,您可以这样做:

      AVPlayerItem *item = [AVPlayerItem playerItemWithURL:urlOfLowerQuality];
      [item seekToTime:player.currentTime];
      [player replaceCurrentItemWithPlayerItem:item];
      

      【讨论】:

      • 最好使用 - (void)seekToTime:(CMTime)time completionHandler:(void (^)(BOOL finished))completionHandler 然后调用 [player replaceCurrentItemWithPlayerItem:playerItem];作为完成处理程序的一部分
      • 请记住,您必须在主线程上调用它并在调用 replaceCurrentItemWithPlayerItem 之前取消注册 kvo 其他明智的应用程序将崩溃以获取更多详细信息结帐stackoverflow.com/questions/14579458/…
      • 你好。你能解释一下如何使用Reachbility来观察用户的网络状态吗?
      【解决方案3】:

      使用 ReachabilityManager 检查 wifi 或 3G 数据类型的当前状态。根据数据模式切换url类型。切换url取视频当前时间,需要设置视频搜索时间。

      【讨论】:

        猜你喜欢
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多