x264編碼器,提供了兩個demo來驗證編碼功能:一個是大而全的x264.c,另一個是簡潔版的example.c。git
其中,前者demo,能夠配置不少編碼參數,但太冗長繁雜,對初學者不太友好。github
後者demo,大多參數都已hard code,用戶僅需調整width、height、color_space信息便可,閱讀起來比較easy。算法
可是存在一個問題,默認輸入/輸出文件是stdin/stdout,這怎麼能行?所以修改了一版來方便你們使用。已上傳至這兒。app
修改部分須要作幾點說明:函數
1. sps/pps頭補加方式:param.b_repeat_headers
編碼
原生方式,在每一個關鍵幀前編碼器都會自動增長該頭信息(由於設置值爲1)。而實際上,通常編碼參數配置了後(不需送yuv幀),spa
就能夠出該csd(Codec Specific Data,對於h264爲sps/pps)數據了,不需每一個關鍵幀前都加該頭信息,所以我將該值修改成了0。code
2. 基於1的修改,須要增長特定接口得到csd數據。視頻
該特定接口函數爲x264_encoder_headers(h, &nal, &i_nal),打開編碼器後,直接調用該接口就能夠得到csd數據。blog
針對該接口,須要補充說明一點,函數返回後i_nal值表明多少個nalu單元,這裏的值是3,即SPS+PPS+SEI共三種類型。
3. profile級別設定:x264_param_apply_profile
原生profile爲「high」,其實我比較排斥B幀,所以修改成了baseline,由於規範中只有該profile不帶B幀。
4. 固定關鍵幀間隔 or 根據場景自動生成
原生方式爲根據場景變換來生成一個關鍵幀,所以何時來KeyFrame是不肯定的。其實,這種方式有其很強的合理性。
什麼場景使用x264編碼器?通常是視頻剪輯,而不是像具體手持設備實時編碼場景(場景畫面變化是物理連續、漸進的),
所以,經常會出現場景切換,這個時候最合理的方案是切換後的第一幀,編碼爲關鍵幀,固然前提條件是須要必定算法去檢測到場景變化了!
而個人需求是:須要出固定關鍵幀間隔!怎麼作呢?編碼參數進行以下配置:
1 param.i_keyint_max = 25; 2 3 param.i_keyint_min = 25;
然而,這樣作起做用了嗎?
答案可能不是那麼幹脆利索,不能簡單用「是」或「否」來回答,只能用「幾乎是」,呵呵。。。
詳細說來,若是圖像幀序列畫風比較平穩,沒有大變天,那麼就會按照25的關鍵幀間隔編碼;
而若是遇到畫風大變,就會智能地編出關鍵幀,而後以該幀爲起點再按25的關鍵幀間隔出幀,直到下一次畫風大變。