【发布时间】:2018-07-29 16:17:08
【问题描述】:
在我的代码中,从 url 播放,如下所示:
private func play() {
let streamUrl = ...
let playerItem = AVPlayerItem(url: streamURL)
radioPlayer = AVPlayer(playerItem: playerItem)
radioPlayer.volume = 1.0
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
} catch {
print("Error deactivating audio session.")
}
radioPlayer.play()
startListeningForStreamFail()
stopStartButton.setImage(#imageLiteral(resourceName: "pause_btn"), for: .normal)
}
就像上面sn-p解释的代码,在调用.play()函数后,我调用startListeningForStreamFail(),它将当前视图控制器注册到两种类型的通知,在主线程上。
private func startListeningForStreamFail() {
DispatchQueue.main.async { [weak self] in
NotificationCenter.default.addObserver(self as Any, selector: #selector(self?.playerItemFailedToPlay), name: NSNotification.Name.AVPlayerItemPlaybackStalled, object: self?.radioPlayer?.currentItem)
NotificationCenter.default.addObserver(self as Any, selector: #selector(self?.playerItemFailedToPlay), name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, object: self?.radioPlayer?.currentItem)
}
}
而选择器的功能是这样的:
@objc private func playerItemFailedToPlay(notification: Notification) {
print("playerItemFailedToPlay")
}
因为流现在工作正常,我正在尝试通过在其网址中添加一些加号来测试失败。但是playerItemFailedToPlay() 函数不会被调用,不会打印任何东西。
是否应该调用此选择器,即使只是更改了 url?
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
我在github上为你建立了一个测试项目,尝试用它测试你的链接,请检查你项目中NSAppTransportSecurity的值
-
感谢您的测试项目和您的耐心等待!我已经测试了我的网址,如果网址正确,它可以正常工作,但使用“假”网址不会出现任何错误。我想知道如果 1. url 有效(但流不起作用)和 2. url 无效,我是否得到相同的错误代码。
-
我添加了一个小技巧来解决假网址。请让我知道这是否适合您
-
在
setup()函数中,如果 url!asset.isPlayable我已将完成值从nil更改为.unvalidURL。现在它可以工作了。我明白你的逻辑了,非常感谢!
标签: ios swift notifications avplayer avplayeritem