一茄唐、簡(jiǎn)介
FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻舀锨、視頻岭洲,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。
多媒體視頻處理工具FFmpeg有非常強(qiáng)大的功能包括視頻采集坎匿、視頻轉(zhuǎn)換盾剩、視頻抓圖、給視頻加水印等替蔬。
二告私、命令&參數(shù)
使用方式:
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile} ...
主要參數(shù)
-i 設(shè)定輸入流
-f 設(shè)定輸出格式
-ss 開(kāi)始時(shí)間
視頻參數(shù):
-b 設(shè)定視頻流量(碼率),默認(rèn)為200Kbit/s
-r 設(shè)定幀速率承桥,默認(rèn)為25
-s 設(shè)定畫(huà)面的寬與高
-aspect 設(shè)定畫(huà)面的比例
-vn 不處理視頻
-vcodec 設(shè)定視頻編解碼器驻粟,未設(shè)定時(shí)則使用與輸入流相同的編解碼器
音頻參數(shù):
-ar 設(shè)定采樣率
-ac 設(shè)定聲音的Channel數(shù)
-acodec 設(shè)定聲音編解碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器
-an 不處理音頻
三凶异、示例
1.視頻格式轉(zhuǎn)換
其實(shí)格式轉(zhuǎn)換說(shuō)法不太準(zhǔn)確蜀撑,但大家都這么叫,準(zhǔn)確的說(shuō)剩彬,應(yīng)該是視頻容器轉(zhuǎn)換
ffmpeg -i input.avi output.mp4 # avi > mp4
ffmpeg -i input.mp4 output.ts # mp4 > ts
2. 提取音頻
比如我有一個(gè)“曉松奇談”酷麦,可是我不想看到他的臉,我只想聽(tīng)聲音喉恋, 地鐵上可以聽(tīng)沃饶,咋辦?
ffmpeg -i test.mp4 -acodec copy -vn output.aac
上面的命令轻黑,默認(rèn)mp4的audio codec是aac绍坝,如果不是會(huì)出錯(cuò),咱可以暴力一點(diǎn)苔悦,不管什么音頻轩褐,都轉(zhuǎn)為最常見(jiàn)的aac。
ffmpeg -i test.mp4 -acodec aac -vn output.aac
-vn 不處理視頻
3. 提取視頻
有些IT員工玖详,特別是做嵌入式的把介,比如機(jī)頂盒,想debug一下蟋座,沒(méi)有音頻的情況下拗踢,播放一個(gè)視頻幾天幾夜會(huì)不會(huì)crash,這時(shí)候你需要一個(gè)純視頻文件向臀,可以這么干巢墅。
ffmpeg -i test.mp4 -vcodec copy -an output.mp4
-an 不處理音頻
4. 視頻剪切
從第5秒開(kāi)始,切3秒出來(lái)
ffmpeg -i test.mp4 -ss 00:00:05 -t 00:00:03 o.mp4
5. 碼率控制
(不懂,暫且記錄)
碼率控制對(duì)于在線視頻比較重要君纫。因?yàn)樵诰€視頻需要考慮其能提供的帶寬。
那么蓄髓,什么是碼率叉庐?很簡(jiǎn)單:bitrate = file size / duration
比如一個(gè)文件20.8M,時(shí)長(zhǎng)1分鐘会喝,那么陡叠,碼率就是: biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音頻的碼率只有固定幾種,比如是128Kbps肢执,
那么枉阵,video的碼率就是 video biterate = 2831Kbps -128Kbps = 2703Kbps
說(shuō)完背景了。好了预茄,來(lái)說(shuō)ffmpeg如何控制碼率兴溜。
ffmpg控制碼率有3種選擇-minrate
、 -b:v
反璃、-maxrate
-b:v主要是控制平均碼率。
比如一個(gè)視頻源的碼率太高了假夺,有10Mbps淮蜈,文件太大,想把文件弄小一點(diǎn)已卷,但是又不破壞分辨率梧田。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
這條命令把碼率從原碼率轉(zhuǎn)成2Mbps碼率,這樣其實(shí)也間接讓文件變小了侧蘸。目測(cè)接近一半裁眯。
不過(guò),ffmpeg官方wiki比較建議讳癌,設(shè)置b:v時(shí)穿稳,同時(shí)加上-bufsize
-bufsize 用于設(shè)置碼率控制緩沖器的大小,設(shè)置的好處是晌坤,讓整體的碼率更趨近于希望的值逢艘,減少波動(dòng)。(簡(jiǎn)單來(lái)說(shuō)骤菠,比如1 2的平均值是1.5它改, 1.49 1.51 也是1.5, 當(dāng)然是第二種比較好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就簡(jiǎn)單了,在線視頻有時(shí)候商乎,希望碼率波動(dòng)央拖,不要超過(guò)一個(gè)閾值,可以設(shè)置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
6. 視頻編碼格式轉(zhuǎn)換
比如一個(gè)視頻的編碼是MPEG4鲜戒,想用H264編碼专控,咋辦?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
當(dāng)然了袍啡,如果ffmpeg當(dāng)時(shí)編譯時(shí)踩官,添加了外部的x265或者X264,那也可以用外部的編碼器來(lái)編碼境输。(不知道什么是X265蔗牡,可以Google一下,簡(jiǎn)單的說(shuō)嗅剖,就是她不包含在ffmpeg的源碼里辩越,是獨(dú)立的一個(gè)開(kāi)源代碼,用于編碼HEVC信粮,ffmpeg編碼時(shí)可以調(diào)用它黔攒。當(dāng)然了,ffmpeg自己也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
7. 只提取視頻ES數(shù)據(jù)
這個(gè)可能做開(kāi)發(fā)的人會(huì)用到强缘,順便提一下吧督惰。
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
8. 過(guò)濾器的使用
8.1 將輸入的1920x1080縮小到960x540輸出
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
ps: 如果540不寫(xiě),寫(xiě)成-1旅掂,即scale=960:-1, 那也是可以的赏胚,ffmpeg會(huì)通知縮放濾鏡在輸出時(shí)保持原始的寬高比。
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表示存儲(chǔ)jpeg的圖像質(zhì)量觉阅,一般2是高質(zhì)量。
如此秘车,ffmpeg會(huì)把該視頻典勇,每隔一秒,存一張圖片下來(lái)叮趴。假設(shè)有60s割笙,那會(huì)有60張。
如果只想要其中n張眯亦,可以設(shè)置截取時(shí)間:ffmpeg -i input.mp4 -ss 00:00:03 -t 00:00:02 -r 1 -q:v 2 -f pic-%03d.jpeg
咳蔚,表示從第3秒開(kāi)始,截取2張