FFmpeg使用手冊 - FFmpeg 的常用命令
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文件。