ffmpeg入門

一、簡介

FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。

多媒體視頻處理工具FFmpeg有非常強大的功能包括視頻采集、視頻轉(zhuǎn)換、視頻抓圖、給視頻加水印等。

二、命令&參數(shù)

使用方式:

ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile} ...

主要參數(shù)

-i 設定輸入流 
-f 設定輸出格式 
-ss 開始時間 

視頻參數(shù):

-b 設定視頻流量(碼率),默認為200Kbit/s 
-r 設定幀速率,默認為25 
-s 設定畫面的寬與高 
-aspect 設定畫面的比例 
-vn 不處理視頻 
-vcodec 設定視頻編解碼器,未設定時則使用與輸入流相同的編解碼器 

音頻參數(shù):

-ar 設定采樣率 
-ac 設定聲音的Channel數(shù) 
-acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器 
-an 不處理音頻

三、示例

1.視頻格式轉(zhuǎn)換

其實格式轉(zhuǎn)換說法不太準確,但大家都這么叫,準確的說,應該是視頻容器轉(zhuǎn)換

ffmpeg -i input.avi output.mp4  # avi > mp4
ffmpeg -i input.mp4 output.ts  # mp4 > ts

2. 提取音頻

比如我有一個“曉松奇談”,可是我不想看到他的臉,我只想聽聲音, 地鐵上可以聽,咋辦?

ffmpeg -i test.mp4 -acodec copy -vn output.aac

上面的命令,默認mp4的audio codec是aac,如果不是會出錯,咱可以暴力一點,不管什么音頻,都轉(zhuǎn)為最常見的aac。

ffmpeg -i test.mp4 -acodec aac -vn output.aac

-vn 不處理視頻

3. 提取視頻

有些IT員工,特別是做嵌入式的,比如機頂盒,想debug一下,沒有音頻的情況下,播放一個視頻幾天幾夜會不會crash,這時候你需要一個純視頻文件,可以這么干。

ffmpeg -i test.mp4 -vcodec copy -an output.mp4

-an 不處理音頻

4. 視頻剪切

從第5秒開始,切3秒出來

ffmpeg -i test.mp4 -ss 00:00:05 -t 00:00:03 o.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

這條命令把碼率從原碼率轉(zhuǎn)成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. 視頻編碼格式轉(zhuǎn)換

比如一個視頻的編碼是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編碼時可以調(diào)用它。當然了,ffmpeg自己也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4

ffmpeg -i input.mp4 -c:v libx264 output.mp4

7. 只提取視頻ES數(shù)據(jù)

這個可能做開發(fā)的人會用到,順便提一下吧。
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 text.mp4 -i logo.png -filter_complex overlay output.mp4
右上角: ffmpeg -i test.mp4 -i logo.jpg -filter_complex overlay=W-w output.mp4
左下角: ffmpeg -i test.mp4 -i logo.jpg -filter_complex overlay=0:H-h output.mp4
右下角: ffmpeg -i test.mp4 -i logo.jpg -filter_complex overlay=W-w:H-h output.mp4

9. 抓取視頻的一些幀,存為圖片

ffmpeg -i test.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg

-r 表示每一秒幾幀
-q:v表示存儲jpeg的圖像質(zhì)量,一般2是高質(zhì)量。

如此,ffmpeg會把該視頻,每隔一秒,存一張圖片下來。假設有60s,那會有60張。

如果只想要其中n張,可以設置截取時間:ffmpeg -i input.mp4 -ss 00:00:03 -t 00:00:02 -r 1 -q:v 2 -f pic-%03d.jpeg,表示從第3秒開始,截取2張

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容