首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS -使用AVPlayer检测URL流是否工作

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

Stack Overflow用户
提问于 2018-02-19 12:13:29
回答 1查看 5.6K关注 0票数 3

在我的代码中,从url开始播放,如下所示:

代码语言:javascript
复制
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(),后者将当前视图控制器注册为两种通知类型。

代码语言:javascript
复制
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)
    }
}

选择器的功能是:

代码语言:javascript
复制
@objc private func playerItemFailedToPlay(notification: Notification) {
    print("playerItemFailedToPlay")
}

因为的流现在工作的很好,所以我正在尝试测试附加的一些附加字符在它的url中的失败。但是playerItemFailedToPlay()函数不会被调用,也不会打印任何东西。

是否应该调用这个选择器,即使只更改了url?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-19 14:38:20

为了便于检查,我尝试在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无效。

在启动可播放链接之后,我还添加了错误的观察者。

代码语言:javascript
复制
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)

编辑:

AVAsset(url: url).isPlayable的部分可能只检查路径是否以适当的扩展结束,例如mp3,mp4。我没有检查实际代码的权限,所以我只引用文档

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48866004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档