iOS-使用AVPlayer检测URL流是否正常工作
在我的代码中,从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
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,也应该调用此选择器吗
任何帮助都将不胜感激。谢谢 我试图在上面构建一个项目,以便于检查 我遵循以下步骤:
让urlString=urlString.trimmingCharacters(在:。空格和换行符中)
guard let url=url(string:urlString)else{return complete(.unvalidull)}
AVAsset(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之前知道这一点。