2017-08-03 102 views
1

我正在用Swift 3製作iOS Radio應用程序!現在它正在工作和播放所有的URL地址音頻流。但是,當我在工作場所時,Wifi對Play音頻流進行限制,因此該應用僅適用於Mobile Data。我如何檢測我的音頻流url無法通過iOS設備播放 - swift3

當我點擊播放按鈕時,它會變成暫停並且不發送任何聲音,它不會播放,控制檯也不會顯示任何連接錯誤或類似的東西。我想知道當某些WIFI網絡的防火牆或代理阻止我的應用發送一些UIAlert並將暫停圖標更改爲播放(如果我不這樣做,用戶將等待音樂)。

我使用Swift 3.0 Xcode 8,AVPlayer播放音頻。我已經嘗試過.addPeriodicTimerObserver,我已經驗證了網址並做了很多事情,但我無法得到我期待的結果。有人能幫我嗎?

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連接有限制(阻止防火牆或代理實際上我不知道),音頻流。

我一直在尋找很多選擇,我嘗試了所有這些選項,但我得到了我期待的結果。

你能幫我嗎?

回答

0

您可以通過

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 

} 

監聽錯誤沒有爲得到清除觀察者

deinit { 
    NotificationCenter.default.removeObserver(self) 
} 
+0

謝謝!我現在要檢查它!我想我已經使用過了,但我會再次測試它! :)我應該寫在viewDidLoad func?或playerStreaming之後?.play() – Cristofer

+0

@Cristofer只要在開始播放前任何時候添加觀察者就可以了,因此您將獲得事件 – zombie

+0

我沒有工作兄弟!不管怎樣,謝謝你!我發佈了我目前的解決方案,我將嘗試找到另一個更好的解決方案! @zombie – Cristofer

0

我想我找到的東西進行檢查。你是什​​麼@zombie? 我檢查了網址是否有效或玩了多少。

P.S.也許我會改變超時值,現在需要很長時間。

控制檯顯示:

錯誤的信息: - >錯誤域= NSURLErrorDomain代碼= -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") 
    } 
} 
+0

I認爲你打開兩個URLSession連接來檢查數據和一個AVPlayer,所以你真的需要這樣做 – zombie

+0

@ zombie yes!現在我打開它,但我會添加驗證,如果錯誤==零將它嘗試播放,如果沒有它將停止所有,並將圖像更改爲再次播放! – Cristofer

+0

如果這對你有用,然後保留它,但正如我記得有另一個來自avplayer的錯誤通知,也許你可以檢查出來,因爲我想如果整數ernet是慢的,那麼你的應用程序的響應速度較慢,如果鏈接有效 – zombie