Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-使用AVPlayer检测URL流是否正常工作_Ios_Swift_Notifications_Avplayer_Avplayeritem - Fatal编程技术网

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

iOS-使用AVPlayer检测URL流是否正常工作,ios,swift,notifications,avplayer,avplayeritem,Ios,Swift,Notifications,Avplayer,Avplayeritem,在我的代码中,从url播放是这样的: private func play() { let streamUrl = ... let playerItem = AVPlayerItem(url: streamURL) radioPlayer = AVPlayer(playerItem: playerItem) radioPlayer.volume = 1.0 do { try AVAudioSession.sharedInst

在我的代码中,从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,也应该调用此选择器吗


任何帮助都将不胜感激。谢谢

我试图在上面构建一个项目,以便于检查

我遵循以下步骤:

  • 将NSAppTransportSecurity添加到info.plist中以允许http

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

    让urlString=urlString.trimmingCharacters(在:。空格和换行符中)

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

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

  • 检查链接是否可播放

    AVAsset(url:url)。可显示

  • 如果前面的任何步骤都不成功,则表示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)
    

    我为你建立了一个测试项目,尝试测试你与它的链接,请检查你的项目中的价值感谢你的测试项目和你的耐心!我已经测试了我的url,如果url是正确的,它可以正常工作,但是使用“假”url不会得到任何错误。我想知道如果1,是否会得到相同的错误代码。url有效(但流不工作),如果为2。url无效。我添加了一个小技巧来解决假url。如果url
    ,请在
    setup()
    函数中告诉我这是否适用于您!asset.isPlayable
    我已将完成值从
    nil
    更改为
    .unvalidul
    。现在它开始工作了。我理解你的逻辑,非常感谢!上面的通知观察员不会被调用…是否有人可以为此提供任何解决方案?可显示的返回值为true,但url为invalid@DanielSpringer你可以检查一下that@zombieURL是“有效的”,但返回404,我想在用户按下play之前知道这一点。