如何检测我的音频流 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的主要内容,如果未能解决你的问题,请参考以下文章

如何检测音频是不是无法静音?

如何在 iOS 应用中检测音频文件的 BPM

VST 音频插件如何检测来自 VST 主机的流中断?

如何检测断开的蓝牙音频设备是当前播放音乐流的设备?

AVPlayer 无法在 iOS 9 上播放

如何将来自 url 的音频流直播到拨出的 twilio 电话中?