iOS - 使用 AVPlayer 检测 URL 流是否正常工作

iOS - Detecting if an URL stream is working or not, with AVPlayer

这就是我的代码,从 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)
    }
}

选择器函数是这样的:

@objc private func playerItemFailedToPlay(notification: Notification) {
    print("playerItemFailedToPlay")
}

因为 现在 工作 很好,我正在尝试通过 添加一些加号来测试失败 在里面是 url。但是 playerItemFailedToPlay() 函数不会被调用,也不会打印任何内容。

是否应该调用此选择器,即使只有 url 已更改?

如有任何帮助,我们将不胜感激。谢谢!

我尝试在 Github 上构建一个项目以便于检查

我遵循了这些步骤:

  1. 将 NSAppTransportSecurity 添加到 info.plist,如 以允许 http

  2. Trim 提供的 url 删除任何空格

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

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

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

  4. 检查link是否可以播放

    AVAsset(url: url).isPlayable

如果前面的任何步骤不成功则表示 url 无效

我还添加了一个观察器,用于在启动可玩游戏后出现错误 link

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)