1. 程式人生 > >FFmpeg使用手冊

FFmpeg使用手冊

http://blog.chinaunix.net/uid-11344913-id-5750173.html

ffmpeg在做音視訊編解碼時非常方便,所以很多場景下轉碼使用的是ffmpeg,銅鼓通過ffmpeg –help命令操作可以看到ffmpeg常見的命令大概分為六部分:

1. ffmpeg資訊查詢部分
2. 公共做操引數部分
3. 檔案主要操作引數部分
4. 視訊操作引數部分
5. 音訊操作引數部分
6. 字幕操作引數部分
ffmpeg資訊查詢部分主要引數:


其中通過ffmpeg --help檢視到的help資訊是基礎的資訊,如果想獲得高階引數部分,可以通過使用ffmpeg --help long引數來檢視,如果希望獲得全部的幫助資訊,可以同過使用ffmpeg --help full引數來獲得。

通過-L引數,可以看到ffmpeg目前所支援的license協議,通過-version檢視ffmpeg的版本,這裡所檢視的版本,是詳細的版本,包含libavformat、libavcodec、libavutil、libavfilter、libswscale、libswresample的版本,如圖:

有時候使用ffmpeg轉碼,發現無法解析視訊檔案,或者無法生成視訊檔案,報一些不支援生成對應的視訊檔案的錯誤,這個時候就需要檢視當前使用的ffmpeg是否支對應的視訊檔案格式,需要使用ffmpeg -formats來檢視:



bbs.chinaffmpeg.com的孫悟空提示,這個列表比較長,還有一些資訊,可以自己執行命令檢視

根據上圖可以看到,在輸出的內容中,分為三部分:
第一列是多媒體檔案格式的Demuxing支援與Muxing支援;
第二列是多媒體檔案格式;
第三列是檔案格式的詳細說明。
下面詳細介紹ffmpeg的封裝轉換。

4.1 ffmpeg 的封裝轉換
FFmpeg的封裝轉換部分,主要是通過libavformat這部分來完成的功能,通過libavformat庫進行mux和demux操作,多媒體檔案的格式有很多種,但是還是有好多demux與mux的操作引數是公用的,下面來詳細介紹一下這些公用的引數:
通過檢視ffmpeg的help full引數,找到AVFormatContext引數部分,在這個引數下面的所有的引數均為封裝轉換可使用的引數:

avioflags: format的緩衝設定,預設為0,就是有緩衝:
direct: 無緩衝狀態;
probesize: 獲得檔案內容的大小;
formatprobesiz: 設定一個獲得檔案內容的大小來解析檔案的format;
fflags: 設定讀取或者寫出的格式的形式的標籤,分為多種方式:flush_packets,ignidx,genpts,nofillin,noparse,igndts,discardcorrupt,sortdts,keepside,fastseek,latm,nobuffer,bitexact,下面針對這些format讀寫方式進行一一詳解;
flush_packets:  立即將packets資料重新整理入檔案中;
genpts: 輸出是產生pts;
nofillin: 不填寫可以精確計算缺失的值;
igndts: 忽略dts;
discardcorrupt: 丟棄損壞的幀;
sortdts: 嘗試以dts的順序為準輸出;
keepside: 不合並資料;
fastseek: 快速seek,但是不夠精確;
latm: 設定RTP MP4_LATM 生效;
nobuffer: 直接讀取或者寫出,不存buffer;
bitexact: 不寫入隨機或者不穩定的資料;
seek2any: 支援隨意seek,這個seek可以不以keyframe為參考;
analyzeduration: 指定解析媒體所需要花銷的時間,這裡設定的值越高,解析的越準確,如果在直播中為了降低延遲,這個可以設定得低一些
codec_whitelist: 設定可以解析的codec的白名單;
format_whitelist: 設定可以解析的format的白名單;


4.2 ffmpeg 的編轉碼
FFmpeg的編解碼部分主要是通過libavcodec這個庫來完成的功能,通過libavcodec庫進行encode與decode操作,多媒體的編碼格式種類很多,但是還是有好多基本的操作引數是共同可以設定的,下面來詳細介紹一下這些公用的引數:
通過檢視ffmpeg的help full引數可以看到AVCodecContext AVOptions,在這個選項下面的所有引數均為編解碼可以使用的引數:
b: 設定音訊與視訊位元速率,可以認為是音視訊加起來的位元速率,預設為200k;
使用這個引數可以根據b:v設定視訊位元速率,b:a設定音訊位元速率;
ab: 設定音訊的位元速率,預設是128k;
g: 設定視訊GOP大小,關鍵幀間隔,預設是12幀一個gop
ar: 設定音訊取樣率,預設為0
ac: 設定音訊通道數,預設為0
bf: 設定非B幀之間的B幀個數,預設為0
maxrate:最大位元速率設定,與bufsize一同使用即可,預設為0
minrate: 最小位元速率設定,配合maxrate與bufsize可以設定為CBR模式,平時基本沒用,預設為0
bufsize:設定控制碼率的buffer的大小,預設為0
keyint_min: 設定最小IDR幀間隔,預設為25
sc_threshold: 設定場景切換支援,預設為0
me_threshold: 設定運動估計閥值,預設為0
mb_threshold: 設定巨集塊閥值,預設為0
profile: 設定音視訊的profile,預設為-99
level: 設定音視訊的level,預設為-99
timecode_frame_start: 設定GOP幀的開始時間,需要在non-drop-frame預設情況下使用
channel_layout: 設定音訊通道的佈局格式
threads: 設定編解碼等工作的執行緒數

4.3 ffmpeg 的基本編轉碼原理
ffmpeg工具主要用途為編碼、解碼、轉碼,常用ffmpeg做的為轉碼操作,使用ffmpeg轉碼主要原理為:

 通過前兩節介紹的引數,可以設定轉碼的相關引數,如果轉碼操作則涉及到封裝的改變,從而可以通過設定AVCodec與AVFormat的操作引數進行封裝與編碼的改變,下面舉一個例子:

從圖中可以看到,上圖引數中使用了前面介紹過的引數:
1. 轉封裝格式從rmvb格式轉為mp4;
2. 視訊編碼從rv40轉為mpeg4;
3. 視訊位元速率從原來的377 kb/s 轉為 200 kb/s;
4. 視訊幀率從原來的 23.98 fps轉為 15 fps
可以分析出,這個例子的流程與前面提到的流程相同,首先解封裝,需要解的封裝為rmvb,然後解碼,其中視訊編碼為rv40,音訊編碼為cook;然後解碼後的視訊編碼為mpeg4,然後封裝為一個沒有音訊的mp4檔案。