【问题标题】:Streaming video from https with AVPlayer causes initial delay使用 AVPlayer 从 https 流式传输视频会导致初始延迟
【发布时间】:2019-06-29 21:46:34
【问题描述】:

我正在使用 AVPlayer 从 https url 播放视频,设置如下:

player = AVPlayer(url: URL(string: urlString))
player?.automaticallyWaitsToMinimizeStalling = false

但由于视频有点长,在视频真正开始播放之前会有短暂的黑屏延迟。我认为这是因为它是从 https 加载的。

有没有办法通过让AVPlayer 立即播放视频而不加载整个视频来消除这种延迟?

我添加了.automaticallyWaitsToMinimizeStalling,但这似乎没有什么不同。

如果有人有任何其他建议,请告诉我。

【问题讨论】:

  • 在这里看看这个问题的答案:stackoverflow.com/a/47055601/4844273 - 你应该使用 AVPlayerItem 和 AVPlayerLayer。
  • @elarcoiris 没有回答。
  • 延迟是不可避免的,为什么不直接覆盖它呢?
  • @matt 那么其他应用如 snapchat 和 instagram 怎么没有呢?
  • 通常将视频的第一屏用作缩略图。当视频加载并开始播放时,它不会闪烁,因此用户认为它是那里的视频。询问您的视频提供商是否具有渐进式下载功能,如果没有请检查@teodora-georgieva 的答案,如果不要求您的视频提供商将视频作为 HTTP 直播流 (HLS) 提供。在任何情况下,在获取第一个缓冲区时都需要第一帧。

标签: ios swift avfoundation avplayer


【解决方案1】:

我认为从 https 加载没有任何关系。你的视频文件格式是什么?我认为您正在考虑自适应比特率流媒体行为。

https://en.wikipedia.org/wiki/Adaptive_bitrate_streaming#Apple_HTTP_Live_Streaming

HTTP Live Streaming (HLS) 是一种基于 HTTP 的媒体流 Apple Inc. 作为 QuickTime 的一部分实施的通信协议 X 和 iOS。 HLS 支持直播和视频点播内容。它 通过将流或视频资产分解为几个小的 不同比特率和设定持续时间的 MPEG2-TS 文件(视频块) 使用流或文件分段器。一种这样的分段器实现是 由苹果公司提供。 [29]分割器还负责生产 一组 M3U8 格式的索引文件,用作播放列表文件 对于视频块。每个播放列表都与给定的比特率级别有关, 并包含块的相对或绝对 URL 相关比特率。然后客户端负责请求 根据可用带宽选择合适的播放列表。

有关 HTTP 实时流的更多信息

https://developer.apple.com/documentation/http_live_streaming

本教程包括一些关于 HTTP Live Streaming 版本和 Non-HTTP Live Streaming 版本的实验。

https://www.raywenderlich.com/5191-video-streaming-tutorial-for-ios-getting-started

【讨论】:

    【解决方案2】:

    您是否尝试过使用 AVPlayerItem 的 preferredForwardBufferDuration?您可以使用此属性管理 AVPlayer 继续缓冲多长时间。

    player.currentItem?.preferredForwardBufferDuration = 1
    

    来自苹果自己的documentation

    播放器应在播放头之前缓冲来自网络的媒体以防止播放中断的持续时间。

    此属性以秒为单位定义首选的转发缓冲区持续时间。如果设置为 0,播放器将为大多数用例选择适当的缓冲级别。将此属性设置为较低的值会增加播放停止和重新缓冲的机会,而将其设置为较高的值会增加对系统资源的需求。

    【讨论】:

      【解决方案3】:

      建议:

      由于视频正在流式传输,我们也依赖网络连接。所以对于网络连接不好的情况,它总是有机会显示一个空白屏幕。

      我们可以这样做,我们可以从服务器获取上一屏流视频的缩略图,也可以从应用程序端从流 URL 生成缩略图。当流媒体屏幕打开时,通过流媒体指示器向用户显示缩略图,当视频开始流媒体时隐藏缩略图。

      【讨论】:

        【解决方案4】:

        在这种特殊情况下,您可以将 UIImageView 放在 AVPLayerlayer 视图的上方。

        1. 该图像用作视频的横向/封面图像,与子视图上的 UIActivityIndi​​cator 上的视频第一帧相匹配。

        2. 现在在视频即将播放时隐藏该图像。

        这有助于隐藏视频的黑框,因为处理视频的初始缓冲区状态是不可避免的。

        【讨论】:

          猜你喜欢
          • 2015-05-04
          • 2012-01-18
          • 2011-11-04
          • 2014-12-14
          • 2012-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多