最近發現某些手機在運行EasyPlayer播放視頻時,會停留在第一幀畫面,雖然有碼率預示着接收端沒有問題,但是畫面卻卡着不動.
一般來講,這個現象有三種原因導致:
- 沒有接收到視頻幀;
- 解碼器出錯,只解出了第一幀圖像;
- 時間戳計算有誤,導致長時間sleep;
那逐一排查下.首先在媒體幀回調的地方下個斷點,發現的確有視頻幀接收到,並且視頻幀最終正常地push到解碼的隊列當中了,說明第一個假設不成立.
其次,我們看看解碼器,似乎也正常工作,沒有打印任何異常信息.解碼線程也並未退出.那也第二個原因也初步排除.
第三步,重新播放下,跟進到解碼線程裏面.發現最終sleep時間大的驚人.解碼線程解完首幀後就一直在睡眠狀態了.再跟蹤一次,發現是硬解碼初始化失敗了,自動切換到軟解碼,而在軟解碼完成首幀解碼後,未把該幀的時間戳賦值給時間戳,這樣實際上首幀時間戳爲0了,後續視頻幀的時間戳與首幀時間戳相隔太大.sleep時間也隨之變得很大.
這個bug較難出現,只有某些手機在硬解碼出錯後,自動切換到軟解碼的情況下才會出現,但是大多數手機硬解碼都能正常工作.
找到問題後,解決了這個問題,就可以順利播放了.