記錄一下工作中常用的FFmpeg命令及其參數(shù)的解釋吼蚁,以例子的形式記錄刺下,某些參數(shù)可以組合使用免绿。詳細(xì)的用法請(qǐng)參考FFmpeg Documention浸剩。
查看可用編解碼器等信息
FFmpeg由于版本的不同,可支持的編解碼器的名稱及功能可能不一樣娄涩,遇到問(wèn)題時(shí)可以查一下
- 可用的編解碼器
ffmpeg –codecs
- 可用的解碼器
ffmpeg –decoders
- 可用的編碼器
ffmpeg –encoders
- 可用的過(guò)濾器
ffmpeg –filters
- 可用的視頻格式
ffmpeg –formats
- 可用的協(xié)議
ffmpeg -protocals
基礎(chǔ)用法
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy -y -f mp4 OUTPUT
-
-i
源輸入窗怒,可以是文件,也可以是網(wǎng)絡(luò)源地址蓄拣,ffmpeg可以有多個(gè)輸入源扬虚,如ffmpeg -i INPUT -i INPUT -i INPUT ……
-
-map
指明對(duì)某個(gè)文件的某個(gè)流進(jìn)行操作,因?yàn)檩斎胛募梢杂卸鄠€(gè)弯蚜,文件也可以有多個(gè)音視頻流孔轴,-map 0
表示對(duì)第一個(gè)文件的所有流進(jìn)行處理,-map 0:1
表示對(duì)第一個(gè)文件的第二個(gè)流進(jìn)行處理碎捺,注意計(jì)數(shù)從0開(kāi)始 -
-c:v
指明輸出文件的視頻編碼路鹰,等同于-codec:v
贷洲,等同于-vcodec
,libx264
即H.264編碼器晋柱,若不想對(duì)視頻重新編碼优构,即保持原視頻的編碼,則后面跟copy
-
-c:a
指明輸出文件的音頻編碼雁竞,用法同上钦椭,等同于-codec:a
,等同于-acodec
-
-y
表示輸出時(shí)如果相同文件名的文件已經(jīng)存在碑诉,則直接覆蓋彪腔,不用詢問(wèn);相反-n
表示遇到此情況時(shí)立即退出 -
-f
指明輸出文件的封裝格式进栽,如mp4
德挣、flv
等
直接推流mp4文件
ffmpeg -re -i INPUT.mp4 -c copy -f flv rtmp://……
-
-c copy
表示音視頻保持原有編碼
本地文件重新編碼并同時(shí)進(jìn)行rtmp推流
ffmpeg -re -i INPUT -acodec aac -ac 2 -ar 44100 -ab 128k -vol 3000 -vcodec libx264 -vb 800k -s 360*640 -r 24 -b 928k -f flv rtmp://……
-
-re
表示以原生幀率讀取數(shù)據(jù)。一般情況下ffmpeg會(huì)以盡可能快的速度讀取數(shù)據(jù)快毛,所以推流文件的話要加上此參數(shù)格嗅,如果是轉(zhuǎn)推直播流的話,不用加此參數(shù) -
-ac
設(shè)置音頻編碼聲道數(shù) -
-ar
設(shè)置音頻編碼采樣率唠帝,單位kHz
屯掖,如44100, 24000襟衰, 16000等 -
-ab
設(shè)置音頻碼率贴铜,也可以寫(xiě)作-b:a
-
-vol
設(shè)置音頻音量為原音頻的多少倍,3000表示為原來(lái)的3000%右蒲,即30倍 -
-vb
設(shè)置視頻碼率阀湿,等同于-b:v
-
-s
設(shè)置視頻分辨率赶熟,參數(shù)格式為w*h
或w×h
-
-r
設(shè)置幀率(fps) -
-b
設(shè)置總碼率瑰妄,分別設(shè)置了音視頻碼率后通常省略
對(duì)視頻畫(huà)面旋轉(zhuǎn)90°
ffmpeg -i INPUT -acodec copy -vcodec libx264 -b 800k -vf transpose=1 OUTPUT
-
-vf
表示對(duì)視頻應(yīng)用Video Filter,可應(yīng)用多個(gè)filter映砖,中間用,
隔開(kāi)并用""
包起來(lái) -
transpose
Video Filter的一種间坐,表示對(duì)視頻畫(huà)面進(jìn)行旋轉(zhuǎn)、翻轉(zhuǎn)變換-
transpose=0
表示先逆時(shí)針旋轉(zhuǎn)90°邑退,再垂直翻轉(zhuǎn)
-
L.R L.l
. . -> . .
l.r R.r
-
transpose=1
表示順時(shí)針旋轉(zhuǎn)90°
L.R l.L
. . -> . .
l.r r.R
-
transpose=2
表示逆時(shí)針旋轉(zhuǎn)90°
L.R R.r
. . -> . .
l.r L.l
-
transpose=3
表示順時(shí)針旋轉(zhuǎn)90°竹宋,再垂直翻轉(zhuǎn)
L.R r.R
. . -> . .
l.r l.L
修改視頻分辨率并添加黑邊
ffmpeg -i INPUT -vf "scale=640:360,pad=640:1138:0:389:black" -acodec copy -vcodec libx264 -s 640*1138 -b 800k OUTPUT
現(xiàn)將視頻分辨率壓縮到640×360,再給視頻加上黑邊地技,最終視頻分辨率改為640×1138
-
scale
Video Filter的一種蜈七,設(shè)置視頻分辨率,假設(shè)分辨率要設(shè)置成200×100莫矗,使用方法如下:
scale=200:100
等同于
scale=200x100
等同于
scale=w=200:h=100
當(dāng)寬或高的值為-1時(shí)飒硅,表示維持原有寬或高
還可以使用一些常量定義砂缩,iw
、ih
三娩、ow
庵芭、oh
,分別表示輸入寬雀监、輸入高双吆、輸出寬、輸出高会前,假設(shè)要縮小到原來(lái)的1/2好乐,則可以用
scale=iw/2:ih/2
假設(shè)要寬度變成原來(lái)的2/3,高度和最后的寬度一樣瓦宜,則可以用
scale=2/3*iw:ow
-
pad
Video Filter的一種曹宴,設(shè)置視頻邊框,使用方法為
pad=w:h:x:y:color
w歉提、h表示輸出的寬笛坦、高,x苔巨、y表示原視頻畫(huà)面在最終輸出畫(huà)面中的左上角位置版扩,color表示邊框的顏色,默認(rèn)是black侄泽,其余顏色請(qǐng)參考FFmpeg顏色定義
裁減視頻畫(huà)面
ffmpeg -i INPUT -vf crop=995:1080:540:0 -acodec copy -vcodec libx264 -f mp4 OUTPUT
-
crop=w:h:x:y
Video Filter的一種礁芦,表示裁切畫(huà)面,從(x, y)的位置開(kāi)始取w×h大小的畫(huà)面
截取視頻生成Gif
從視頻25s處開(kāi)始悼尾,截取10s長(zhǎng)度的畫(huà)面生成320x240大小柿扣、幀率為15fps的Gif
ffmpeg -ss 25 -t 10 -i INPUT -s 320x240 -f gif -r 15 OUTPUT.gif
-
-ss
表示從輸入文件開(kāi)始讀取的時(shí)間位置,也就是開(kāi)始截取的時(shí)間點(diǎn)闺魏,參數(shù)格式為HH:MM:SS.mmm
未状,小時(shí)和分鐘可以省略,截取的時(shí)間點(diǎn)不是完全精準(zhǔn)的 -
-t
表示截取的時(shí)間長(zhǎng)度析桥,即duration司草,也可以使用-to
,表示截取的截止時(shí)間點(diǎn)泡仗,配合-ss
來(lái)定義截取的長(zhǎng)度 -
-r
表示輸出幀率
截取視頻內(nèi)任意時(shí)間點(diǎn)的一幀圖像保存為JPEG文件
ffmpeg -ss 16.1 -i INPUT -s 320x240 -vframes 1 -f image2 OUTPUT.jpeg
-
-vframes
設(shè)置要輸出的幀的個(gè)數(shù)埋虹,等同于-frames:v
-
-f image2
表示封裝格式為image2類型,image2
為FFmpeg中的圖片封裝格式名稱
抽取幀序列娩怎,再生成Gif
從源視頻中每秒鐘抽取5幀圖像搔课,保存為一系列JPEG文件
ffmpeg -ss 25 -t 10 -i INPUT -r 5 -s 320x240 -f image2 D:\result-%03d.jpeg
-
D:\result-%03d.jpeg
自動(dòng)按序號(hào)命名輸出
將這一系列JPEG圖像合成為幀率5 fps的GIF文件
ffmpeg -f image2 -framerate 5 -i D:\result-%03d.jpeg OUTPUT.gif
-
-framerate
表示每秒讀取多少幀,與-r
好像不同截亦,讀取圖片類型時(shí)最好用這個(gè)
生成高質(zhì)量Gif
上述方法生成的Gif畫(huà)質(zhì)比較一般爬泥,下面的方法可生成更高質(zhì)量的Gif旦事,windows平臺(tái)下將下面代碼存為bat文件執(zhí)行即可
@echo on
set start_time=00:00:10
set duration=5
set palette="D:\tmp\palette.png"
set filters="fps=15,scale=270:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y OUTPUT.gif
pause
中間要生成一個(gè)調(diào)色板文件D:\tmp\palette.png
,再利用此調(diào)色板生成Gif急灭,具體原理請(qǐng)參閱使用FFmpeg處理高質(zhì)量GIF圖片
剪切視頻
ffmpeg -ss 00:00:20 -t 00:00:30 -i INPUT -c copy OUTPUT
精確剪切mp4視頻
ffmpeg -i input.mp4 -qscale 0 -intra temp.mp4
ffmpeg -ss 00:00:30 -vsync 0 -t 00:00:30 -i temp.mp4 -acodec libvo_aacenc -vcodec libx264 output.mp4
-
-qscale
Use fixed quality scale (VBR)姐浮,即使用動(dòng)態(tài)碼率,值越小質(zhì)量越高 -
-intra
表示使用幀內(nèi)編碼 -
-vsync
視頻同步方法葬馋,0表示:Each frame is passed with its timestamp from the demuxer to the muxer.
將一張圖片轉(zhuǎn)成任意時(shí)長(zhǎng)的視頻
ffmpeg -loop 1 -i input.png -vcodec libx264 -vb 500k -s 480*640 -r 15 -t 10 ouput.mp4