ffmpeg基礎知識

序:    

       什麼是影片:實際上就是很多張圖片,在間隔時間很短的連續展示出來。電影實際上就是很多張圖片的集合。如果我們原封不動的保存起來,納悶佔用空間會很大,如果我們使用算法將其壓縮一下,變成幀,在將幀變成流,再把流放到容器中,就是我們常見的電影了。一部電影中至少包含兩種流:h.264的視頻流,AAC的音頻流。

     容器(Container):就是一種文件格式,如:flv、mkv等。包含下面5種流以及文件頭信息

     流(Stream)        :是一種視頻信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據

     幀(Frame)         :幀代表一副靜止的圖像,分爲:I、P、B幀

     編解碼器(Codec)   :是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)

     複用/解複用(mux/demux):把不同的流按照某種容器的規則放入容器,這種行爲叫做複用(mux)

                                                把不同的流從某種容器中解析出來,這種行爲叫做解複用(demux)

     I、P、B幀:視頻壓縮中,每幀代表一幅靜止的圖像。而在實際壓縮時,會採取各種算法減少數據的容量,其中IPB是最常見的

     I幀:關鍵幀,可以理解爲某一幀畫面的完整保留,解碼時只需要本幀數據就可以完成

     P幀:表示這一幀和前一幀之間的差別,解碼時只需要前一幀的畫面加上本幀定義的差別就可以生成最終畫面

     B幀:雙向差別幀,通過前後畫面的與本幀數據的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累

      從上面的解釋看,我們知道I和P的解碼算法比較簡單,資源佔用也比較少,I只要自己完成就行了,P呢,也只需要解碼器把前一個畫面緩存一下,遇到P時就使用之前緩存的畫面就好了,如果視頻流只有I和P,解碼器可以不管後面的數據,邊讀邊解碼,線性前進,大家很舒服。但網絡上的電影很多都採用了B幀,因爲B幀記錄的是前後幀的差別,比P幀能節約更多的空間,但這樣一來,文件小了,解碼器就麻煩了,因爲在解碼時,不僅要 用之前緩存的畫面,還要知道下一個I或者P的畫面(也就是說要預讀預解碼),而且,B幀不能簡單地丟掉,因爲B幀其實也包含了畫面信息,如果簡單丟掉,並 用之前的畫面簡單重複,就會造成畫面卡(其實就是丟幀了),並且由於網絡上的電影爲了節約空間,往往使用相當多的B幀,B幀用的多,對不支持B幀的播放器 就造成更大的困擾,畫面也就越卡。 一般平均來說,I的壓縮率是7(跟JPG差不多),P是20,B可以達到50,可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。

 

    編解碼過程:

       1. 註冊所有容器格式和CODEC:av_register_all()

  2. 打開文件:av_open_input_file()

  3. 從文件中提取流信息:av_find_stream_info()

  4. 窮舉所有的流,查找其中種類爲CODEC_TYPE_VIDEO

  5. 查找對應的解碼器:avcodec_find_decoder()

  6. 打開編解碼器:avcodec_open()

  7. 爲解碼幀分配內存:avcodec_alloc_frame()

  8. 不停地從碼流中提取出幀數據:av_read_frame()

  9. 判斷幀的類型,對於視頻幀調用:avcodec_decode_video()

  10. 解碼完後,釋放解碼器:avcodec_close()

  11. 關閉輸入文件:av_close_input_file()

 

庫:

1、libavformat:用於各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生成解碼上下文結構和讀取音視頻幀等功能,包含demuxers和muxer庫;

2、libavcodec:用於各種類型聲音/圖像編解碼;

3、libavutil:包含一些公共的工具函數;

4、libswscale:用於視頻場景比例縮放、色彩映射轉換;

5、libpostproc:用於後期效果處理;

6、ffmpeg:是一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡實時編碼;

7、ffsever:是一個HTTP多媒體實時廣播流服務器,支持時光平移;

8、ffplay:是一個簡單的播放器,使用ffmpeg 庫解析和解碼,通過SDL顯示;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章