【问题标题】:AVPlayer not play HLS live streamAVPlayer 不播放 HLS 直播
【发布时间】:2018-07-23 13:33:22
【问题描述】:

我在使用 HLS 直播时遇到问题。有时当我通过代码创建 AVPlayer 时:

    if let mediaUrl = URL(string: obj.message.replacingOccurrences(of: ".mpd", with: ".m3u8")) {
  // load movie via url
  self.player = AVPlayer(url: mediaUrl)
  let layer = AVPlayerLayer(player: self.player)
  self.streamView.layer.addSublayer(layer)
  // set stream view where will be shown stream
  layer.frame = self.streamView.layer.bounds
  self.player.play()
}

我有空白屏幕,没有流也没有错误,但是当我锁定设备并解锁时,流开始了。

当我尝试播放流时,这种情况每 10/20 次发生一次。

有什么建议吗?

【问题讨论】:

    标签: ios swift avplayer live-streaming http-live-streaming


    【解决方案1】:

    我遇到了同样的问题,查看日志显示我的流式传输网址不安全。所以这是 ATS(应用程序传输安全)问题。 通过在 info.plist 中添加 ATS 特定 KVP 解决了该问题

    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSAllowsArbitraryLoads</key>
            <true/>
        </dict>
    

    【讨论】:

      【解决方案2】:

      验证您的mediaUrl 是否已填充。尝试流式传输 Apple 的示例直播:https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8

      这对我来说运行良好(虽然我没有实现你的 streamView)

      private var player: AVPlayer!
      
      override func viewDidLoad() {
          super.viewDidLoad()
          if let mediaUrl = URL(string: "https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8") {
              // load movie via url
              self.player = AVPlayer(url: mediaUrl)
              let layer = AVPlayerLayer(player: self.player)
              self.view.layer.addSublayer(layer)
              // set stream view where will be shown stream
              layer.frame = self.view.layer.bounds
              self.player.play()
          }
      }
      

      【讨论】:

        【解决方案3】:

        原因可能是视频中的元数据错误。看看我回答的这个帖子:AVPlayer HLS live stream IOS

        转码后的视频需要有配置基线才能在 AVPlayer 中播放。详细看ffmpeg转码命令:

        https://gist.github.com/chung-nguyen/d88e73e3cc8788878f5ffb8c232b4729

        【讨论】:

          【解决方案4】:

          尝试创建AVPlayer的新对象,不要使用AVPlayer的sharedInstance然后检查。

          表示总是创建新的 AVPlayer 对象,不要使用 self.player。

          然后检查。

          【讨论】:

          • self.player 是我的类变量而不是 AVPlayer 实例。
          • 是的,请不要为 AVPlayer 使用类变量。始终在方法中创建新的,然后检查。
          • 经过多次测试,我的效果与类变量一样
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          • 2020-02-29
          • 2012-10-20
          • 2014-02-12
          • 2020-05-15
          • 1970-01-01
          • 2017-04-28
          相关资源
          最近更新 更多