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 直播的主要内容,如果未能解决你的问题,请参考以下文章