1. 程式人生 > >iOS 不能播放遠端視訊(Android 可以)的問題

iOS 不能播放遠端視訊(Android 可以)的問題

問題描述:

1、同樣的 url,Android 能放,iOS 不能放。後臺給的 url 是這個樣子(mp4檔案格式):

http://192.168.80.102:28085/schcommonweb/weedfs/rdownload/[email protected]

2、用 KVO 監聽 AVPlayerItem 的 status 發現報錯:

Code=-11850 Code=-12939 Operation Stopped The server is not correctly configured

3、用瀏覽器(Safari或者Chrome)直接開啟 url,發現也不能播放,而是變成下載。視訊檔案下載後,可以正常播放,說明 mp4 檔案格式也是正確的。

4、但是換一個從網上找的視訊 url,卻能正常播放。

通過上述問題初步斷定應該是後臺的問題。於是讓後臺逐一排查。後來發現,iOS 和 Android 在播放此類 url 時,都會用到 HTTP 1.1 的 Range bytes 頭,但二者的行為略有不同:

iOS 的 AVPlayer 在第一次請求時,會發送一個 Range: bytes=0-1 的請求頭,此時伺服器應該返回 206 和 content-range 及 content-length 響應訊息。AVPlayer 用這兩個位元組的資料來判斷檔案型別(即 ftyp,請參考 http://www.ftyps.com/),然後後面的請求才是正常的讀取視訊資料。

而 Android 卻不會有讀取 ftyp 的過程。

而後臺由於粗心的原因,在計算 Range 的時候,不知道為什麼會在 iOS 的第一次請求 bytes=0-1 時將 content-length 計算錯了,計算成 -1。從而導致 iOS 無法播放而 Android 能正常播放。

正確的後臺程式碼可以參考網上的這篇部落格