Stark Wong 的個人開發網站
 


 此頁面:更新於 2023 年 8 月 7 日 23 時 21 分 33 秒,頁面處理需時 0.0012 秒
 網站內容版權所有(C)Stark Wong。頁面(不包括檔案)可自由連結。網站系統版本 1.90-AngularJSBase (2015/9/27)
 
網站地圖

Warning: Undefined variable $row in /var/www/html/blog.inc.php on line 25

Warning: Trying to access array offset on value of type null in /var/www/html/blog.inc.php on line 25
iOS 16.6 的 AVPlayer 問題

我們最近收到客戶報告說我們的播放程式不正常,當我們用升級到 iOS 16.6 的 iPad 進行測試時的確發現兩個問題:

  1. 有些時候畫面會凍結,但使用者仍可操作界面
  2. 有些時候裝置會異常發熱,而且點擊屏幕反應極慢或沒反應,再過一段時間程式自動被系統殺掉

經過一段時間研究後,我們發現問題是出現在 AVPlayer (mediaserverd) 中切換畫質的部份,當符合下列條件時有超過一半可能會觸發:

  1. 裝置為 iPad (實測發生問題的裝置至少有 iPad Mini 及 iPad 9.7 吋)
  2. 系統已升級到 iPad 16.6
  3. 播放程式有在播放開始時/前限制最大頻寬
  4. 播放途中有因超過最大頻寬而觸發降低播放畫質

我們最初發現的問題是源自串流超過定義頻寬,例如是程式中定義最大頻寬為 6Mbps,而串流中定義頻寬為 5.3Mbps,理論上實際頻寬峰值不應該超過定義值,然而在我們實際所得,該串流峰值每隔一段時間就會超過 6Mbps,而當每次超過定義值的時候,mediaserverd 會將該定義值更新為新的峰值。當新的峰值超過我們所限制的最大頻寬時,mediaserverd 就會將該畫質排除而選擇次一級的畫質。然而在 iOS16.6 下,mediaserverd 有可能會不斷在兩個畫質之間切換 (每秒可達 7 次),由於每次畫質切換會向串流伺服器發出額外的請求,導致超過串流伺服器所設定的同時連接數閥值而令伺服器傳回HTTP 429 (請求過多) 錯誤,而 mediaserverd 由於重覆請求失敗而令所有畫質都被排除,最後導致播放停止,也就是第一個問題的成因。不過即使我們將串流伺服器的同時連接數加大,雖然可以避免播放停止,但由於不同切換畫質耗用處理能力,在問題出現約5分鐘就會導致程式無法回應使用者操作。相關的記錄可以在這裡找到。

這個問題似乎還有另一個方法會觸發而並非因為超過頻寬。在我們的測試串流中,在 5.3Mbps 畫質下面是一條約 3.5Mbps 的畫質,當開始播放前將最大頻寬設成 4Mbps 時,問題 100% 會觸發。

這個問題還有一個連帶的影響,就是當播放開始後無法在中段改變最大頻寬 (例如我們在程式中可以讓使用者因為網路環境降低畫質以改善流暢度)。在 iOS 16.6 中改變最大頻寬並不能觸發 mediaserverd 將播放出中而高於最大頻寬的畫質排除。

對於這個問題,我們目前只能將最大頻寬由 6Mbps 改為不可能在中途觸發的 10Mbps,直至串流伺服器能解決峰值過大的問題為止。至於 iOS 17 下是否有這個問題我們暫時不清楚,因為手上沒有升級到 iOS 17 的 iPad。但從 iOS 17 的 iPhone 測試所得,雖然未發現上述的問題,但仍發現重覆觸發(但並非不斷觸發)切換相同畫質,而且仍然是無法在中途變更畫質,所以我懷疑這個問題在 iOS 17 也有出現。


撰寫於:2023/8/7 22:44:00 / 回應:0
正在讀取回響內容...
其他內容請回到主頁