命令格式算法
功能
FFmpeg命令是在ffmpeg.exe可執行文件環境下執行,ffmpeg.exe用於音視頻的轉碼,加水印,去水印,視頻剪切,提取音頻,提取視頻,碼率控制等等功能。
最簡單的命令
ffmpeg -i input.avi -b:v 640k output.mp4
該命令將當前文件夾下的input.avi文件轉換爲output.mp4文件,並將output.mp4文件視頻的碼率設置爲640kpbs。
命令格式
ffmpeg -i {輸入文件路徑} -b:v {輸出視頻碼率} {輸出文件路徑}
全部的參數都是以鍵值對的形式指定的。例如輸入文件參數是」-i」,而參數值是文件路徑;輸出視頻碼率參數是」-b:v」,而參數值時視頻的碼率值。可是注意位於最後面的輸出文件路徑前面不包含參數名稱。
命令參數 less
//音頻拼接
//方式一:
ffmpeg -i "concat:0.mp3|1.mp3" -acodec copy output.mp3
解釋:-i表明輸入參數
concat:0.mp3|1.mp3 須要鏈接到一塊兒的音頻文件
-acodec copy output.mp3 從新編碼並複製到新文件中
//方式二:
-i 124.mp3 -i 123.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 remix.mp3
//ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -filter_complex '[0:0] [1:0] [2:0] concat=n=3:v=0:a=1 [a]' -map [a] meg1.mp3
解釋:-i表明輸入參數
-filter_complex ffmpeg濾鏡功能,很是強大,詳細請查看文檔
amix是混合多個音頻到單個音頻輸出
inputs=2表明是2個音頻文件,若是更多則表明對應數字
duration 肯定最終輸出文件的長度
longest(最長)|shortest(最短)|first(第一個文件)
dropout_transition
The transition time, in seconds, for volume renormalization when an input stream ends. The default value is 2 seconds.
-f mp3 輸出文件格式
方式三:
ffmpeg -f concat -i file.txt meg.mp3
解釋:將須要拼接的音頻文件名稱寫出 file 文件名.mp3換行,這樣一行一行寫到txt文件中,meg.mp3爲輸出文件。
//把darkdoor.[001-100].jpg序列幀和001.mp3音頻文件利用mpeg4編碼方式合成視頻文件darkdoor.avi:
$ ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -author skypp -vcodec mpeg4 darkdoor.aviide
//要查看你的ffmpeg支持哪些格式,能夠用以下命令:
$ ffmpeg -formats | lessoop
//還能夠把視頻文件導出成jpg序列幀:
$ ffmpeg -i bc-cinematic-en.avi example.%d.jpg測試
//debian下安裝ffmpeg很簡單:
#apt-get install ffmpeg編碼
#音頻轉碼
轉MP3爲wav
ffmpeg -i input.mp3 -acodec pcm_s16le -ac 2 -ar 44100 output.wav
轉m4a爲wav
ffmpeg -iinput.m4a -acodec pcm_s16le -ac 2 -ar 44100 output.wav
wav與PCM的相互轉換,把raw改成pcm便可
ffmpeg -iinput.wav -f s16le -ar 44100 -acodec pcm_s16le output.raw
PCM轉wav
ffmpeg -f s16le -ar 44100 -ac 2 -acodec pcm_s16le -i input.raw output.wav
用ffplay播放PCM
ffplay -f s16le -ar 44100 -ac 2 **.raw
//提取音頻
ffmpeg -i test.mp4 -acodec copy -vn output.aac
//上面的命令,默認mp4的audio codec是aac,若是不是,能夠都轉爲最多見的aac。
ffmpeg -i test.mp4 -acodec aac -vn output.aac.net
//提取視頻
ffmpeg -i input.mp4 -vcodec copy -an output.mp4debug
//視頻剪切
//下面的命令,能夠從時間爲00:00:15開始,截取5秒鐘的視頻。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
//-ss表示開始切割的時間,-t表示要切多少。上面就是從15秒開始,切5秒鐘出來。3d
//碼率控制
//碼率控制對於在線視頻比較重要。由於在線視頻須要考慮其能提供的帶寬。
//那麼,什麼是碼率?很簡單:
//bitrate = file size / duration
//好比一個文件20.8M,時長1分鐘,那麼,碼率就是:
//biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
//通常音頻的碼率只有固定幾種,好比是128Kbps,
//那麼,video的就是
//video biterate = 2831Kbps -128Kbps = 2703Kbps。
//那麼ffmpeg如何控制碼率。
//ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate
//-b:v主要是控制平均碼率。
//好比一個視頻源的碼率過高了,有10Mbps,文件太大,想把文件弄小一點,可是又不破壞分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
//上面把碼率從原碼率轉成2Mbps碼率,這樣其實也間接讓文件變小了。目測接近一半。
//不過,ffmpeg官方wiki比較建議,設置b:v時,同時加上 -bufsize
//-bufsize 用於設置碼率控制緩衝器的大小,設置的好處是,讓總體的碼率更趨近於但願的值,減小波動。(簡單來講,好比1 2的平均值是1.5, 1.49 1.51 也是1.5, 固然是第二種比較好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
//-minrate -maxrate就簡單了,在線視頻有時候,但願碼率波動,不要超過一個閾值,能夠設置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4調試
//視頻編碼格式轉換
//好比一個視頻的編碼是MPEG4,想用H264編碼,咋辦?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
//相反也同樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
//固然了,若是ffmpeg當時編譯時,添加了外部的x265或者X264,那也能夠用外部的編碼器來編碼。(不知道什麼是X265,能夠 Google一下,簡單的說,就是她不包含在ffmpeg的源碼裏,是獨立的一個開源代碼,用於編碼HEVC,ffmpeg編碼時能夠調用它。固然 了,ffmpeg本身也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
//只提取視頻ES數據
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
//過濾器的使用
//將輸入的1920x1080縮小到960x540輸出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 若是540不寫,寫成-1,即scale=960:-1, 那也是能夠的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比。
//爲視頻添加logo(也就是爲視頻添加水印)
//將一張圖片貼到一個視頻上,那能夠用以下命令:
ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
要貼到其餘地方?看下面:
//右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
//左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
//右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
//能夠設置座標,視頻的左上角爲原點
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=480:10" output.mp4
//去掉視頻的logo(去掉水印)
//語法:-vf delogo=x:y:w:h[:t[:show]]
//x:y 離左上角的座標
//w:h logo的寬和高
//t: 矩形邊緣的厚度默認值4
//show:若設置爲1有一個綠色的矩形,默認值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
//截取視頻圖像
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
//-r 表示每一秒幾幀
//-q:v表示存儲jpeg的圖像質量,通常2是高質量。
//如此,ffmpeg會把input.mp4,每隔一秒,存一張圖片下來。假設有60s,那會有60張。
//能夠設置開始的時間,和你想要截取的時間。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
//-ss 表示開始時間
//-t 表示共要多少時間。
//如此,ffmpeg會從input.mp4的第20s時間開始,往下10s,即20~30s這10秒鐘之間,每隔1s就抓一幀,總共會抓10幀。
//序列幀與視頻的相互轉換
//把darkdoor.[001-100].jpg序列幀和001.mp3音頻文件利用mpeg4編碼方式合成視頻文件darkdoor.avi:
$ ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -author fy -vcodec mpeg4 darkdoor.avi
//還能夠把視頻文件導出成jpg序列幀:
$ ffmpeg -i bc-cinematic-en.avi example.%d.jpg
//輸出YUV420原始數據
//對於一下作底層編解碼的人來講,有時候常要提取視頻的YUV原始數據,以下:
ffmpeg -i input.mp4 output.yuv
//那若是我只想要抽取某一幀YUV呢?
//你先用上面的方法,先抽出jpeg圖片,而後把jpeg轉爲YUV。
//好比:
//你先抽取10幀圖片。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
//而後,你就隨便挑一張,轉爲YUV:
ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv
//若是-s參數不寫,則輸出大小與輸入同樣。
//固然了,YUV還有yuv422p啥的,你在-pix_fmt 換成yuv422p就行啦!
//H264編碼profile & level控制
//先科普一下profile&level。(這裏討論最經常使用的H264)
//H.264有四種畫質級別,分別是baseline, extended, main, high:
// 一、Baseline Profile:基本畫質。支持I/P 幀,只支持無交錯(Progressive)和CAVLC;
// 二、Extended profile:進階畫質。支持I/P/B/SP/SI 幀,只支持無交錯(Progressive)和CAVLC;(用的少)
// 三、Main profile:主流畫質。提供I/P/B 幀,支持無交錯(Progressive)和交錯(Interlaced),
// 也支持CAVLC 和CABAC 的支持;
// 四、High profile:高級畫質。在main Profile 的基礎上增長了8x8內部預測、自定義量化、 無損視頻編碼和更多的YUV 格式;
//H.264 Baseline profile、Extended profile和Main profile都是針對8位樣本數據、4:2:0格式(YUV)的視頻序列。在相同配置狀況下,High profile(HP)能夠比Main profile(MP)下降10%的碼率。
//根據應用領域的不一樣,Baseline profile多應用於實時通訊領域,Main profile多應用於流媒體領域,High profile則多應用於廣電和存儲領域。
//fmpeg如何控制profile&level
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4
//若是ffmpeg編譯時加了external的libx264,那就這麼寫:
ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4
//從壓縮比例來講,baseline< main < high,對於帶寬比較侷限的在線視頻,可能會選擇high,但有些時候,作個小視頻,但願全部的設備基本都能解碼(有些低端設備或早期的設備只能解碼 baseline),那就犧牲文件大小吧,用baseline。本身取捨吧!
//編碼效率和視頻質量的取捨(preset, crf)
//除了上面提到的,強行配置biterate,或者強行配置profile/level,還有2個參數能夠控制編碼效率。
//一個是preset,一個是crf。
//preset也挺粗暴,基本原則就是,若是你以爲編碼太快或太慢了,想改改,能夠用profile。
//preset有以下參數可用:
//ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.
//編碼加快,意味着信息丟失越嚴重,輸出圖像質量越差。
//CRF(Constant Rate Factor): 範圍 0-51: 0是編碼毫無丟失信息, 23 is 默認, 51 是最差的狀況。相對合理的區間是18-28.
//值越大,壓縮效率越高,但也意味着信息丟失越嚴重,輸出圖像質量越差。
//舉個例子吧。
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -x264opts crf=18
//(參考自:[https://trac.ffmpeg.org/wiki/Encode/H.264]
//H265 (HEVC)編碼tile&level控制
//和H264的profile&level同樣,爲了應對不一樣應用的需求,HEVC制定了「層級」(tier) 和「等級」(level)。
//tier只有main和high。
//很少說,直接給出怎麼用。(supposed你用libx265編碼)
ffmpeg -i input.mp4 -c:v libx265 -x265-params "profile=high:level=3.0" output.mp4
//a) 通用選項
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協議的。。。
-f fmt 強迫採用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置做者
-copyright string 設置版權
-comment string 設置評論
-target type 設置目標文件類型(vcd,svcd,dvd) 全部的格式選項(比特率,編解碼以及緩衝區大小)自動設置 ,只須要輸入以下的就能夠了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質量設置
-itsoffset offset 設置以秒爲基準的時間偏移,該選項影響全部後面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
//b) 視頻選項
-b bitrate 設置比特率,缺省200kb/s
-r fps 設置幀頻 缺省25
-s size 設置幀大小 格式爲WXH 缺省160X128.下面的簡寫也能夠直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設置頂部切除帶大小 像素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設置頂部補齊的大小 像素單位
-padbottom size –padleft size –padright size –padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:蘭排列,好比 000000表明黑色)
-vn 不作視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式。 若是用copy表示原始編解碼數據必須被拷貝。
-sameq 使用一樣視頻質量做爲源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼很是有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名爲file
//c)高級視頻選項
-g gop_size 設置圖像組大小
-intra 僅適用幀內編碼
-qscale q 使用固定的視頻量化標度(VBR)
-qmin q 最小視頻量化標度(VBR)
-qmax q 最大視頻量化標度(VBR)
-qdiff q 量化標度間最大誤差 (VBR)
-qblur blur 視頻量化標度柔化(VBR)
-qcomp compression 視頻量化標度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始複雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp誤差
-i_qoffset offset 在p和i幀間的qp誤差
-rc_eq equation 設置碼率控制方程 默認tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設置運動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 設置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設置錯誤殘留爲n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設置錯誤掩蔽爲bit_mask,該值爲以下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用於mpeg4
-part 使用數據劃分 僅用於mpeg4
-bug param 繞過沒有被自動監測到編碼器的問題
-strict strictness 跟標準的嚴格性
-aic 使能高級幀內編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不採用交織方法
-interlace 強迫交織法編碼 僅對mpeg2和mpeg4有效。當你的輸入是交織的而且你想要保持交織以最小圖像損失的時候採用該選項。可選的方法是不交織,可是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視頻編碼統計到vstats_hhmmss.log
-vhook module 插入視頻處理模塊 module 包括了模塊名和參數,用空格分開
//D)音頻選項
-ab bitrate 設置音頻碼率
-ar freq 設置音頻採樣率
-ac channels 設置通道 缺省爲1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
//E)音頻/視頻捕獲選項
-vd device 設置視頻捕獲設備。好比/dev/video0
-vc channel 設置視頻捕獲通道 DV1394專用
-tvstd standard 設置電視標準 NTSC PAL(SECAM)
-dv1394 設置DV1394捕獲
-av device 設置音頻設備 好比/dev/dsp
//F)高級選項
-map file:stream 設置輸入流映射
-debug 打印特定調試信息
-benchmark 爲基準測試加入時間
-hex 傾倒每個輸入包
-bitexact 僅使用位精確算法 用於編解碼測試
-ps size 設置包大小,以bits爲單位
-re 以本地幀頻讀數據,主要用於模擬捕獲設備