AVPlayer 不播放 HLS 直播

Posted

技术标签:

【中文标题】AVPlayer 不播放 HLS 直播【英文标题】:AVPlayer not play HLS live stream 【发布时间】: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 次发生一次。

有什么建议吗?

【问题讨论】:

【参考方案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 使用类变量。始终在方法中创建新的,然后检查。 经过多次测试,我的效果与类变量一样

以上是关于AVPlayer 不播放 HLS 直播的主要内容,如果未能解决你的问题,请参考以下文章

Hls 流 url 不会在 AVPlayer 中播放

AVPlayer HLS 直播 IOS

AVPlayer HLS 直播电平表(显示 FFT 数据)

AVPlayer 播放受保护的 HLS,令牌过期如何更新?

AVPlayer 在在线模式下停止播放 AES 加密的离线 HLS 视频

带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为