我对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次的情况。
有什么建议吗?
答案 0 :(得分:1)
我遇到了同样的问题,通过日志显示我的流URL不安全。因此,这就是ATS(应用程序传输安全性)问题。 通过在info.plist中添加ATS特定的KVP解决了该问题
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
答案 1 :(得分:0)
尝试创建AVPlayer的新对象,不要使用AVPlayer的sharedInstance,然后进行检查。
方法总是创建AVPlayer的新对象,不要使用self.player。
然后检查。
答案 2 :(得分:0)
验证您的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 :(得分:0)
原因可能是视频中的元数据错误。看看我回答的这个线程:AVPlayer HLS实时流IOS
已转码的视频需要具有配置文件基准,才能在AVPlayer中播放。查看ffmpeg转码命令以了解详细信息:
https://gist.github.com/chung-nguyen/d88e73e3cc8788878f5ffb8c232b4729