華爲E6108V9E部分機頂盒播放H264編碼格式1920*1080分辨率媒體資源編解碼器解碼失敗問題總結**
設備信息:華爲E6108V9E cpu:rk3228 arm-v7 API19
在使用ExoPlayer播放器播放H264編碼格式,1920*1080分辨率的媒體資源時播放失敗
添加探針深入分析發現:
allRenderersReadyOrEnded = false ——> renderedFirstFrame = false ——> MediaCodec.dequeueOutputBuffer =-1
分析:dequeueOutputBuffer爲從編碼器獲取一個輸出緩存區並返回索引值,返回-1表示未獲取到輸出緩存組或超時
1.首先設置超時時間爲1000000Us,未能解決問題,排除讀取解碼器數據超時
2.懷疑是否數據未存入編解碼器輸入緩存數組,經排查發現dequeueInputBuffer返回值爲正數,排除
3.是否配置編解碼器配置參數錯誤,結合網絡查詢資料分析,rk3228系列cpu在處理H264/1080p媒體資源可能出現編碼位數16位對齊問題
解決方案:在MediaCodecVideoRenderer的getMediaFormat方法中把原來的
frameworkMediaFormat.setInteger(MediaFormat.KEY_MAX_HEIGHT, codecMaxValues.height);
改爲
if (codecMaxValues.height%16>0){ frameworkMediaFormat.setInteger(MediaFormat.KEY_HEIGHT, (codecMaxValues.height/16+1)*16); frameworkMediaFormat.setInteger(MediaFormat.KEY_MAX_HEIGHT, (codecMaxValues.height/16+1)*16); }else { frameworkMediaFormat.setInteger(MediaFormat.KEY_MAX_HEIGHT, codecMaxValues.height); }
成功解決問題!
https://forum.kodi.tv/showthread.php?tid=152005&pid=1344619#pid1344619