iOS – 使用AVPlayer检测URL流是否正常工作
这是我的代码,从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()
,它在主线程上将当前viewcontroller注册为两种类型的通知。
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) } }
选择器function如下:
@objc private func playerItemFailedToPlay(notification: Notification) { print("playerItemFailedToPlay") }
因为现在流正常工作 ,我试图通过addig在它的url中添加一些加号来测试失败。 但是不会调用playerItemFailedToPlay()
函数,也不会打印任何东西。
是否应该调用此选择器,即使只更改了url?
任何帮助,将不胜感激。 谢谢!
我尝试在Github上构建一个项目,以便于检查
我按照以下步骤操作:
-
将NSAppTransportSecurity添加到info.plist中, 如此答案中允许http
-
修剪提供的url以删除任何空格
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)