如何检测我的音频流 url 是不是无法被 iOS 设备播放 - swift3
Posted
技术标签:
【中文标题】如何检测我的音频流 url 是不是无法被 iOS 设备播放 - swift3【英文标题】:How can I detect if my audio streaming url can not be play by iOS device - swift3如何检测我的音频流 url 是否无法被 iOS 设备播放 - swift3 【发布时间】:2017-08-03 19:56:51 【问题描述】:我正在使用 Swift 3 制作 ios Radio 应用程序!现在它可以正常工作并播放所有 url 地址音频流。但是当我在工作场所时,Wifi 对播放音频流有限制,因此该应用程序仅适用于移动数据。
当我点击播放按钮时,它变为暂停并且不发送任何声音,它不播放并且控制台不显示任何连接错误或类似的东西。我想知道某些 WIFI 网络的防火墙或代理何时阻止我的应用程序发送一些 UIAlert 并将暂停图标更改为播放(如果我不这样做,用户将等待音乐)。
我正在使用 Swift 3.0 Xcode 8 ,AVPlayer 来播放音频。我已经尝试过 .addPeriodicTimerObserver,我已经验证了 url 并做了很多事情,但我无法得到我正在寻找的结果。有人可以帮我吗?
var urlStreaming:String = "http://someurl"
playerStreaming = AVPlayer(url: URL(string: url)!)
playerLayer = AVPlayerLayer(player: playerStreaming)
playerLayer.frame = CGRect(x:0, y: 0, width:1, height: 10)
self.view.layer.addsublayer(playerLayer)
playerStreaming?.play()
我的playerStreaming?.play()
在无法播放时没有向我发送任何内容,因为它开始尝试播放,但几秒钟后它停止并且没有发送任何内容。当我使用工作场所的 WIFI 连接时,它会发生,但如果我将其更改为移动数据,我可以收听音频。如果我从另一个 wifi 连接播放,例如我的房子、公园或星巴克咖啡 wifi,我也可以毫无问题地收听它。
我知道我工作场所的 Wifi 连接对音频流有限制(实际上我不确定被防火墙或代理阻止。)。
我一直在寻找很多选项,我尝试了所有选项,但我得到了我正在寻找的结果。
你能帮帮我吗?
【问题讨论】:
【参考方案1】:我想我找到了可以检查的东西。你怎么看@zombie? 我检查了网址是否有效或播放需要多少。
P.S.也许我会改变 Time Out 值,现在它需要很多时间。
控制台显示:
错误信息:-> Error Domain=NSURLErrorDomain Code= -1001 "请求超时" 。我想我可以验证我的错误是否为空。如果它为空,我可以显示 UIAlert
let urltest = URL(string: yourul)
let task = URlSession.shared.dataTask(with: urlTest!)
data, response, error in
if(error != nil)
print("Error info: -> \(error!)")
//I think here I can changes the Image if i found a error
else
print("It is going to be play without problem")
【讨论】:
我认为你打开了两个连接,一个使用 URLSession 来检查数据,一个使用 AVPlayer,所以你真的需要这样做 @zombie 是的!现在我打开了它,但我会添加验证,如果错误 == nil,它将尝试播放,如果不是,它将停止所有并再次将图像更改为播放! 如果这对你有用,那就保留它,但我记得有另一个来自 avplayer 的错误通知,也许你可以检查一下,因为我认为如果互联网速度很慢,那么你正在制作如果链接有效,应用响应会变慢 如果您可以编辑您的问题并添加无效的 url,那么我明天会尝试检查错误,因为我来晚了【参考方案2】:你可以通过
来监听错误NotificationCenter.default.addObserver(self, selector: #selector(playerItemFailedToPlay(_:)), name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemFailedToPlay(_:)), name: NSNotification.Name.AVPlayerItemPlaybackStalled, object: nil)
func playerItemFailedToPlay(_ notification: Notification)
let error = notification.userInfo?.first(where: $0.value is Error ) as? Error
不要让 get 移除观察者
deinit
NotificationCenter.default.removeObserver(self)
【讨论】:
谢谢!我马上去检查!我想我已经使用了它,但我要再次测试它! :) 我应该把它写在 viewDidLoad 函数中吗?或在 playerStreaming?.play() 之后 @Cristofer 只需在您认为合适的任何时候添加观察者,然后再开始玩,这样您就可以获得活动 我没有工作,兄弟!还是非常感谢!我在我当前的解决方案下面发布了,我将尝试找到另一个更好的解决方案! @僵尸 我已经改过,用来回答对性能更好。只是我添加了 AVPlayerItemPlaybackStalledNotification @Cristofer 感谢您的反馈,我更新了我的答案,但是您如何得到 AVPlayerItemPlaybackStalled 的错误我不确定是否有比我所做的更好的方法以上是关于如何检测我的音频流 url 是不是无法被 iOS 设备播放 - swift3的主要内容,如果未能解决你的问题,请参考以下文章