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上构建一个项目,以便于检查

我按照以下步骤操作:

  1. 将NSAppTransportSecurity添加到info.plist中, 如此答案中允许http

  2. 修剪提供的url以删除任何空格

    let urlString = urlString.trimmingCharacters(in: .whitespacesAndNewlines)

  3. 检查字符串是否提供有效链接

    guard let url = URL(string: urlString) else { return complete(.unvalidURL) }

  4. 检查链接是否可播放

    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)