最近在做播放器在電視盒子上的適配,發現一個嚴重的問題:低端機型解碼能力不足。表現是丟幀,音畫不同步。對此,有兩種解決方法。
一、解碼前丟幀
思路是記錄25幀(1s)解碼的總時間decodeTotalTime,減去25幀播放的總時間playTotalTime得到差值diff。如果diff大於0,說明解碼耗時較長,應該開啟丟幀。丟幀策略可以開啟級別,最低級為8幀丟一幀,最高級為2幀丟1幀,直到diff小於0,關閉丟幀。
二、渲染前丟幀
由於音視頻同步時,會把音頻的播放時間作為標准時間,視頻同步時會與標准時間校准。那么可以得到視頻時間戳的實際值與理想值的差值。如果這個差值在一定的范圍內(60ms?),那么視為可以忍受的范圍;如果這個差值大於一個閾值,那么開啟丟幀,丟幀同樣設置級別,直到視頻時間戳的實際值與理想值在一定范圍內,再關閉丟幀。
適配電視盒子時,發現即使丟幀了,仍然還有音畫不同步現象。對此,把音視頻同步的邏輯改的更激進了一點,也就是說視頻追趕音頻的步進值更大,問題得以解決。這種改法的缺點是,觀看正片時會有些許一頓一頓的現象。