在我的部落格移動平臺播放器ijkplayer開源框架分析(以IOS原始碼為例),大致介紹了一下ijkplayer的基本函式呼叫順序和主要執行緒作用,本部落格想介紹一下在直播應用中,針對卡頓和秒開做的一些優化,本優化經驗主要是用在Android系統上,ios上也可以借鑑,按本部落格修改程式碼,網路頻寬足夠的情況下,音視訊播放基本流暢不卡頓,首屏時間在500ms以內。

     首先來看直播應用中的卡頓。直播中會引起卡頓,主要是網路有抖動的時候,沒有足夠的資料來播放,ijkplayer會激發其緩衝機制,主要是有幾個巨集控制,主要需要做的修改是DEFAULT_LAST_HIGH_WATER_MARK_IN_MS這個巨集的意思緩衝多少資料後開始通知緩衝完成,我們直播中設定為1 * 1000,也即緩衝1秒後開始通知緩衝完成,預設是5秒,如果過大,會讓使用者等太久,那麼巨集也可以設定DEFAULT_HIGH_WATER_MARK_IN_BYTES小一些,設定為30 * 1024。

    我們在來看看秒開,首先,我們知道在ijkplayer預設視訊同步到音訊,在video_refresh_thread對視訊做了同步,我們把視訊前兩幀資料不做同步,即時重新整理,這樣能大大加快首屏時間,其次我們設定probesize大小,如果probesize不設定的話,avformat_find_stream_info會消耗很長時間,這裡建議如果只是音訊,設定1k,如果是音視訊,設定為64k,更進一步的修改是自己設定相關解碼屬性,不用avformat_find_stream_info獲取,最後我們還可以對前兩幀的重新整理時機進行進一步優化,現在通過sleep來控制,可以換成訊號量,解碼之後,立即通知開始執行渲染,改完這些之後基本上首屏能在500ms內。

    在這也說說關於直播的延遲,如果延遲過大,可以採取兩種策略,一種是丟幀,一種是追幀。我們可以考慮丟音訊包來實現,音訊包不不在關鍵幀的問題,丟起來比較好操作,然後因為視訊同步到音訊,所以視訊會追幀,也會跟上來。

    部分經驗來自同事分享,在此表示感謝。

參考連結: