在我的代码中,从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)
}正如上面的代码片段所解释的那样,在调用.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")
}因为的流现在工作的很好,所以我正在尝试测试附加的一些附加字符在它的url中的失败。但是playerItemFailedToPlay()函数不会被调用,也不会打印任何东西。
是否应该调用这个选择器,即使只更改了url?
任何帮助都将不胜感激。谢谢!
发布于 2018-02-19 14:38:20
为了便于检查,我尝试在Github上构建一个项目
我遵循了以下步骤:
let urlString = urlString.trimmingCharacters(in: .whitespacesAndNewlines)guard let url = URL(string: urlString) else { return complete(.unvalidURL) }AVAsset(url: url).isPlayable如果前面的任何步骤没有成功,那么它就意味着url无效。
在启动可播放链接之后,我还添加了错误的观察者。
NotificationCenter.default.addObserver(self, selector: #selector(itemFailedToPlayToEndTime(_:)), name: .AVPlayerItemFailedToPlayToEndTime, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(itemNewErrorLogEntry(_:)), name: .AVPlayerItemNewErrorLogEntry, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(itemPlaybackStalled(_:)), name: .AVPlayerItemPlaybackStalled, object: nil)编辑:
AVAsset(url: url).isPlayable的部分可能只检查路径是否以适当的扩展结束,例如mp3,mp4。我没有检查实际代码的权限,所以我只引用文档
https://stackoverflow.com/questions/48866004
复制相似问题