官方文檔:ffmpeg Documentation
查看支持的硬件加速方法
ffmpeg -hwaccels
結(jié)果包含:
Hardware acceleration methods:
cuda
dxva2
qsv
d3d11va
opencl
vulkan
GPU加速轉(zhuǎn)換視頻
ffmpeg -y -vsync 0 -hwaccel cuda -i input.mp4 -vf scale=960:-1 -c:a copy -c:v h264_nvenc -b:v 10M output.mp4
-y 若輸出文件存在則覆蓋
-vsync 0 passthrough: 時間戳不做任何改變犬第,demuxer中是什么,直接傳給muxer
-hwaccel cuda 使用cuda硬件加速
-i input.mp4 輸入視頻文件
-vf scale=960:-1 改變視頻尺寸,-1表示按比例變化
-c:a分別代表視頻,音頻格式,copy代表原視頻格式
-c:v h264_nven NVIDIA硬件解碼
-b:v 10M 輸出視頻碼率單位K,M
改變視頻音頻速度
視頻速度提高一倍荷愕,音頻不變,多余幀丟棄
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
視頻速度提高一倍,音頻不變柜某,提高幀率避免丟幀(如原來30幀提高到60幀)
ffmpeg -i input.mkv -r 60 -filter:v "setpts=0.5*PTS" output.mkv
濾波器通過改變每個視頻幀的呈現(xiàn)時間戳(PTS)來工作,如果要降低速度敛纲,則使用大于1的PTS喂击。
音頻速度提高一倍,視頻不變
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
atempo過濾器限于使用介于0.5和2.0之間的值(因此它可以將其減慢到不小于原始速度的一半淤翔,并且速度不超過輸入的兩倍)笙什。如果你需要,你可以通過串聯(lián)多個atempo過濾器來克服這個限制慕嚷,如:
ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv
使用復(fù)雜的濾鏡侈贷,同時加速視頻和音頻
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
合并多個視頻
使用 FFmpeg concat 分離器
這種方法成功率很高,也是最好的抡谐,但是需要 FFmpeg 1.1 以上版本
先創(chuàng)建一個文本文件 filelist.txt:
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
……
命令:
ffmpeg -f concat -i filelist.txt -c copy output.mkv
注意:
輸出文件的擴(kuò)展名必須與輸入文件相同裁奇。
使用 FFmpeg concat 分離器時,如果文件名有奇怪的字符麦撵,要在 filelist.txt 中轉(zhuǎn)義刽肠。
合并視頻和音頻
視頻中不包含音頻,并且視頻和音頻長度相同
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec aac -strict experimental output.mp4
視頻中包含音頻免胃,用新的音頻替換原音頻
ffmpeg -i video.mp4 -i audio.mp3 -vcodec copy -acodec aac -strict experimental -map 0:v:0 -map 1:a:0?output.mp4
視頻和音頻長度不同音五,視頻短于音頻,-ss指定音頻開始時間羔沙,用視頻長度截取音頻
ffmpeg -i video.mp4?-ss 00:04:00?-i audio.mp3 -vcodec copy -acodec aac -shortest output.mp4
視頻和音頻長度不同放仗,音頻短于視頻,-ss指定音頻開始時間撬碟,添加靜默填充
ffmpeg -i video.mp4?-ss 00:04:00-i audio.mp3 -vcodec copy -acodec aac?-af apad -shortest?output.mp4
視頻轉(zhuǎn)換為GIF
ffmpeg -ss 10 -t 5 -i input.mp4 -vf "fps=24,scale=320:-1:flags=lanczos,format=rgb24,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
-ss 起始時間诞挨;-t 持續(xù)時間;fps 輸出幀率呢蛤;scale 輸出尺寸惶傻;flags 縮放方法
序列圖片轉(zhuǎn)換為視頻
首先對序列圖片進(jìn)行重命名,文件名中需要有數(shù)字序列標(biāo)記圖片的先后順序其障,如pic01.jpg银室、pic02.jpg……pic**.jpg。
按照默認(rèn)參數(shù)將序列圖片轉(zhuǎn)換為視頻,默認(rèn)視頻幀率25fps蜈敢,采用h264編碼辜荠,圖片原始分辨率。
ffmpeg -f image2 -i pic%d.jpg?-profile:v high -level 3.0 -pix_fmt yuv420p output.mp4
%d為數(shù)字占位符抓狭,前導(dǎo)零填充如001伯病、002、003可以表示為%03d否过,它與 C printf 函數(shù)支持的語法相同午笛。
常用參數(shù):
-r 調(diào)整幀率
需要注意-r參數(shù)的位置,在-i pic%d.jpg前面和在后面的效果是不一樣的苗桂。放在-i后面只會改變輸出的視頻幀率药磺,而輸入的還是默認(rèn)值25 ,例如ffmpeg -f image2 -i pic%d.jpg -r 10 output.mp4煤伟,會先按照25fps生成視頻癌佩,但視頻的播放幀率會減小到10fps。
-b:v 調(diào)整視頻碼率
改變碼率會影響到視頻清晰度便锨,但并不意味著高碼率的視頻一定比低碼率的視頻清晰度更高围辙,這還取決于視頻編碼格式,比如h265編碼可以用更小的碼率生成h264同等的視頻質(zhì)量鸿秆,av1酌畜、v8怎囚、v9等編碼也優(yōu)于h264卿叽。
-crf 調(diào)整視頻質(zhì)量
用以平衡視頻質(zhì)量和文件大小的參數(shù),F(xiàn)FMPEG里取值范圍為0-51恳守,取值越高內(nèi)容損失越多考婴,視頻質(zhì)量更差。 ffmpeg的默認(rèn)值是23催烘,建議的取值范圍是17-28沥阱。
-c:v 調(diào)整視頻的編碼格式
目前ffmpeg針對于mp4默認(rèn)使用的是h264,可以使用-c:v libx265生成同等質(zhì)量伊群,但文件更小的h265視頻考杉。也可以使用-c:v libvpx -c:v libvpx-vp9分別生成v8和v9編碼的webm文件。
-vf scale 調(diào)整視頻分辨率
使用-s 640x480會將視頻直接調(diào)整為640x480的分辨率舰始,如果原始圖片不是4:3會對原始圖像做拉伸變形崇棠。可以使用下面的命令等比例縮放
-vf scale=640:-1????????固定寬度進(jìn)行等比例縮放
-vf scale=-1:480? ? ? ? 固定高度進(jìn)行等比例縮放
以上幾個參數(shù)不僅限于圖片轉(zhuǎn)視頻丸卷,視頻轉(zhuǎn)視頻時也可以使用枕稀。
提取音頻
提取音頻且不對其進(jìn)行重新編碼
ffmpeg -i videoWithAudio.mp4 -vn -acodec copy onlyAudio.aac
提取音頻并重新編碼
ffmpeg -i videoWithAudio.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3
該命令從視頻中提取音頻,然后使用libmp3lame將音頻編碼為不同的質(zhì)量,并將其存儲為mp3文件萎坷。
-q:a表示質(zhì)量(在LAME文檔中定義[1])凹联,質(zhì)量分布范圍為0~6,其中0表示高質(zhì)量音頻哆档,6表示低質(zhì)量音頻蔽挠。
截取音頻片段
ffmpeg -i input.mp3 -ss 00:00:10 -t 00:00:10 output.mp3
-ss 起始時間;-t 持續(xù)時間虐呻;