一、FFmpeg命令集舉例
1. 視頻格式轉換
(其實格式轉換說法不太准確,但大家都這么叫,准確的說,應該是視頻容器轉換) 比如一個avi文件,想轉為mp4,或者一個mp4想轉為ts。 我目測這個已經能滿足很多人的需求了。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
2.獲取視頻的信息
ffmpeg -i video.avi 提示信息:At least one output file must be specified(必須至少指定一個輸出文件)
3.1提取音頻
比如我有一個“曉松奇談”,可是我不想看到他的臉,我只想聽聲音, 地鐵上可以聽,咋辦?
ffmpeg -i 曉松奇談.mp4 -acodec copy -vn output.aac
上面的命令,默認mp4的audio codec是aac,如果不是會出錯,咱可以暴力一點,不管什么音頻,都轉為最常見的aac。
ffmpeg -i 曉松奇談.mp4 -acodec aac -vn output.aac
3.2 提取音頻和視頻
比如機頂盒,想debug一下,沒有音頻的情況下,播放一個視頻幾天幾夜會不會crash,這時候你需要一個純視頻文件,可以這么干。
分離視頻流 :
ffmpeg -i F:\Tinywan\Video\test.mkv -vcodec copy -an F:\Tinywan\Video\output_file_video.mp4
分離音頻流 :
ffmpeg -i F:\Tinywan\Video\test.mkv -acodec copy -vn F:\Tinywan\Video\output_file_audio.mp3
4. 視頻剪切
經常要測試視頻,但是只需要測幾秒鍾,可是視頻卻有幾個G,咋辦?切啊!
ffmpeg -ss 00:00:00 -t 00:05:00 -y -i "F:\Tinywan\Video\test.mkv" -vcodec copy -acodec copy F:\Tinywan\Video\cutVideo.mp4
=====================================================解釋如下:============================================================
上面的這個例子是將test.mkv視頻的前5分鍾,重新生成一個新視頻。
-ss 開始切割時間,如: 00:00:00,表示從0秒開始,格式也可以00:00:0
-t 要切割時長,如: 00:05:00,表示截取5分鍾長的視頻,格式也可以00:3:00
-y 如果文件已存在強制替換,覆蓋輸出文件,即如果 output.wmv 文件已經存在的話,不經提示就覆蓋掉。
-i 輸入,后面是空格,緊跟着就是輸入視頻文件; -vcodec copy 和 -acodec copy表示所要使用的視頻和音頻的編碼格式,這里指定為copy表示原樣拷貝;
5. 視頻截圖
在第三秒的時候截圖
第一種方式:(測試成功)
ffmpeg -i F:\Tinywan\Video\test.mkv -y -f mjpeg -ss 3 -t 1 F:\Tinywan\Video\test1.jpg
第二種方式:(測試成功)
ffmpeg -i F:\Tinywan\Video\test.mkv -y -f image2 -ss 3 -vframes 1 F:\Tinywan\Video\test2.jpg
6. 獲取視頻時長
ffmpeg -i F:\Tinywan\Video\test.mkv 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
7.將rtmp流,以文件的形勢保存到本地(測試成功)
ffmpeg -i "rtmp://tinywan.amai8.com/live123/4008899 live=1" -acodec copy -vcodec copy -f flv -y F:\Tinywan\Video\RTMPtest2test.flv
8.原樣視頻mp4格式轉換成avi格式輸出(測試成功)
ffmpeg -i cutVideo.mp4 -vcodec copy -acodec copy cutVideoCopy.avi
9.設定輸出視頻碼率為64kbit/s
ffmpeg -i cutVideo.mp4 -b:v 64k -bufsize 64k -y output64.mp4 //畫面明顯的模糊的不行啊!
10.切換幀率到24fps
ffmpeg -i input.avi -r 24 output.avi
11.導出圖片
這將每秒依據cutVideo.mp4生成一個圖片命名為foo-001.jpeg ,foo-002.jpeg以此類推,圖片尺寸是1680*1050。
ffmpeg -i cutVideo.mp4 -r 1 -s 1680*1050 -f image2 foo-%03d.jpeg
下面是每秒生成25幀:
ffmpeg -i 4face_1h.mp4 -r 25 -f image2 image/image-%05d.jpg
12.從圖片或者圖片序列生成視頻
這里的語法foo-%03d.jpeg指明使用3位數字來補充完整文件名,不足3位以0補齊。這類似於C語言的printf函數中的格式,但只接受常規整數作為部分。
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s 640*320 fooimage2.avi
當導入一個圖片序列時,-i也支持shell的通配符模式(內置的),這需要同時選擇image2的特性選項-pattern_type glob:例如下面就利用了所有匹配foo-*.jpeg的圖片序列創建一個視頻:
ffmpeg -f image2 -framerate 1 -i %05d.jpg -s 640*320 -y fooimage2.avi
這里圖片必須的連續,否則會報錯
使用指定圖片生成視頻:
ffmpeg -r 25 -loop 1 -i 4face.jpeg -vcodec libx264 -b:v 600k -r:v 25 -preset medium -crf 30 -s 1920*1080 -r 25 -t 3600 4face_1h.mp4
5. 碼率控制
碼率控制對於在線視頻比較重要。因為在線視頻需要考慮其能提供的帶寬。
那么,什么是碼率?很簡單:
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
6. 視頻編碼格式轉換
比如一個視頻的編碼是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
7. 只提取視頻ES數據
這個可能做開發的人會用到,順便提一下吧。
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
8. 過濾器的使用
這個我在另一篇博客提到了,這里貼一下吧。
8.1 將輸入的1920x1080縮小到960x540輸出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比。
8.2 為視頻添加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
8.3 去掉視頻的logo
有時候,下載了某個網站的視頻,但是有logo很煩,咋辦?有辦法,用ffmpeg的delogo過濾器。
語法:-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命令基本選項:
-formats 輸出所有可用格式
-f fmt 指定格式(音頻或視頻格式)
-i filename 指定輸入文件名,在linux下當然也能指定:0.0(屏幕錄制)或攝像頭
-y 覆蓋已有文件
-t duration 記錄時長為t
-fs limit_size 設置文件大小上限
-ss time_off 從指定的時間(s)開始, [-]hh:mm:ss[.xxx]的格式也支持
-itsoffset time_off 設置時間偏移(s),該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
-title string 標題
-timestamp time 時間戳
-author string 作者
-copyright string 版權信息
-comment string 評論
-album string album名
-v verbose 與log相關的
-target type 設置目標文件類型("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number 設置要記錄的幀數
視頻選項:
-b 指定比特率(bits/s),似乎ffmpeg是自動VBR的,指定了就大概是平均比特率
-bitexact 使用標准比特率
-vb 指定視頻比特率(bits/s)
-vframes number 設置轉換多少楨(frame)的視頻
-r rate 幀速率(fps) (可以改,確認非標准楨率會導致音畫不同步,所以只能設定為15或者29.97)
-s size 指定分辨率 (320x240)
-aspect aspect 設置視頻長寬比(4:3, 16:9 or 1.3333, 1.7777)
-croptop size 設置頂部切除尺寸(in pixels)
-cropbottom size 設置底部切除尺寸(in pixels)
-cropleft size 設置左切除尺寸 (in pixels)
-cropright size 設置右切除尺寸 (in pixels)
-padtop size 設置頂部補齊尺寸(in pixels)
-padbottom size 底補齊(in pixels)
-padleft size 左補齊(in pixels)
-padright size 右補齊(in pixels)
-padcolor color 補齊帶顏色(000000-FFFFFF)
-vn 取消視頻
-vcodec codec 強制使用codec編解碼方式('copy' to copy stream)
-sameq 使用同樣視頻質量作為源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名為file
-newvideo 在現在的視頻流后面加入新的視頻流
高級視頻選項
-pix_fmt format set pixel format, 'list' as argument shows all the pixel formats supported
-intra 僅適用幀內編碼
-qscale q 以<數值>質量為基礎的VBR,取值0.01-255,約小質量越好
-loop_input 設置輸入流的循環數(目前只對圖像有效)
-loop_output 設置輸出視頻的循環數,比如輸出gif時設為0表示無限循環
-g int 設置圖像組大小
-cutoff int 設置截止頻率
-qmin int 設定最小質量,與-qmax(設定最大質量)共用,比如-qmin 10 -qmax 31
-qmax int 設定最大質量
-qdiff int 量化標度間最大偏差 (VBR)
-bf int 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
音頻選項:
-ab 設置比特率(單位:bit/s,也許老版是kb/s)前面-ac設為立體聲時要以一半比特率來設置,比如192kbps的就設成96,轉換 默認比特率都較小,要聽到較高品質聲音的話建議設到160kbps(80)以上。
-aframes number 設置轉換多少楨(frame)的音頻
-aq quality 設置音頻質量 (指定編碼)
-ar rate 設置音頻采樣率 (單位:Hz),PSP只認24000
-ac channels 設置聲道數,1就是單聲道,2就是立體聲,轉換單聲道的TVrip可以用1(節省一半容量),高品質的DVDrip就可以用2
-an 取消音頻
-acodec codec 指定音頻編碼('copy' to copy stream)
-vol volume 設置錄制音量大小(默認為256) <百分比> ,某些DVDrip的AC3軌音量極小,轉換時可以用這個提高音量,比如200就是原來的2倍
-newaudio 在現在的音頻流后面加入新的音頻流
字幕選項:
-sn 取消字幕
-scodec codec 設置字幕編碼('copy' to copy stream)
-newsubtitle 在當前字幕后新增
-slang code 設置字幕所用的ISO 639編碼(3個字母)
Audio/Video 抓取選項:
-vc channel 設置視頻捕獲通道(只對DV1394)
-tvstd standard 設