【问题标题】:iOS - Detecting if an URL stream is working or not, with AVPlayeriOS - 使用 AVPlayer 检测 URL 流是否正常工作
【发布时间】: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


【解决方案1】:

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

我按照以下步骤操作:

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

  2. 修剪提供的网址以删除所有空格

    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)

【讨论】:

  • 以上通知观察者不会被调用....有人可以为此提供任何解决方案
  • isPlayable 返回 true 但 url 无效
  • @DanielSpringer 你可以检查这个answer
  • @zombie URL 是“有效”但返回 404,我想在用户按下播放之前知道这一点。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多