1. 程式人生 > >基於ffmpeg的播放器起播延遲優化

基於ffmpeg的播放器起播延遲優化

一個視訊的播放,播放器的執行步驟大致如下:讀取原始資料、解複用、解碼、顯示。對於vlc和ijk播放器的編解碼部分都是使用ffmpeg,在這裡以開源專案ijkplayer為例分析播放器在讀取原始資料後的解碼執行步驟:
1. avformat_open_input()該函式用於開啟多媒體資料並且獲得一些相關的資訊,宣告位置libavformat\avformat.h,函式執行成功的話,其返回值大於等於0。該函式呼叫成功之後會對結構體AVFormatContext進行一些處理。
   int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)
    ps:函式呼叫成功之後處理過的AVFormatContext結構體。
    file:開啟的視音訊流的URL。
    fmt:強制指定AVFormatContext中AVInputFormat的。這個引數一般情況下可以設定為NULL,這樣FFmpeg可以自動檢測AVInputFormat。
    dictionay:附加的一些選項,一般情況下可以設定為NULL。

2. avformat_find_stream_info()函式可以讀取一部分視音訊資料並且獲得一些相關的資訊。函式正常執行後返回值大於等於0。
   int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
   ic:輸入的AVFormatContext。
   options:額外的選項,目前沒有深入研究過。
   該函式上下文部分是調節起播延遲效果最明顯的地方。函式分析流的時間主要由傳入的AVFormatContext的probesize 和 max_analyze_duration兩個屬性決定,probesize是探測讀入大小,預設值為32K;max_analyze_duration預設值為5S。在網路狀況比較好的情況下可分別設定4K和1S,也可根據具體情況在起播畫面效果、起播延遲、分析成功率等因素間取捨。這兩個引數的設定在avformat_open_input()函式對結構體AVFormatContext處理完成後進行設定。

3. 對於解碼過程中後面執行的av_read_frame() 、avcodec_decode_video2()等函式,目前還未發現針對起播延遲的可優化地方。後面繼續補充。

上面提到的probesize的設定,在呼叫者初始化播放器時,可由外面傳入設定,