【问题标题】: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 连接对音频流有限制(实际上我不确定被防火墙或代理阻止。)。

我一直在寻找很多选项,我尝试了所有选项,但我得到了我正在寻找的结果。

你能帮帮我吗?

【问题讨论】:

    标签: ios swift3 avplayer audio-streaming http-proxy


    【解决方案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 的错误我不确定是否有比我所做的更好的方法
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多