【FFmpeg】入門常用功能
到ffmpeg.org下載full版,添加ffmpeg下的bin文件夾的文件路徑到環(huán)境變量
在命令行中輸入:
ffmpeg -h ? ?
(查看幫助)
ffmpeg -i demo.mp4?
(輸入視頻,查看信息)
ffmpeg -i demo.mp4 demo.mkv ? ?
(最簡(jiǎn)單的視頻格式轉(zhuǎn)換)把mp4轉(zhuǎn)成mkv,同時(shí)這個(gè)方法可以直接把視頻轉(zhuǎn)成音頻
ffmpeg -i video_with_audio.mp4 -i newAudio.wav \
-map 0:0 \
-map 1:0 \
-c:v copy \
-c:a libmp3lame -q:a 0 \
-shortest \
video_with_newAudio.mp4
(給視頻替換音軌)(或者是給無(wú)音頻的視頻添加音頻)
代碼解釋:
代碼里的"\"表示換行,你可以不換,如果你想換,Windows里輸入^再回車,Linux里輸入\再回車。
兩個(gè)-i作用是:輸入視頻文件和音頻文件,若文件名有空格,可用單引號(hào)'將文件名括起來(lái)
-map0:0意思是:第一個(gè)0指第一個(gè)輸入的文件(.mp4),第二個(gè)0是指容器(.mp4)的第一條軌道(視頻)
-map1:0意思是:第二個(gè)輸入的文件(.wav)的第一條軌道(音頻)
-c:v copy意思是:c(codecs編解碼器) v(video視頻) copy(即復(fù)制原軌道)
-c:a 指定音頻編碼器為libmp3lame,這個(gè)是.mp4的音頻軌道所用的編碼器
-q:a表示質(zhì)量,質(zhì)量分布范圍為0~6,其中0表示高質(zhì)量音頻,6表示低質(zhì)量音頻。
-shortest 指合并視頻和音頻的時(shí)候,合并出來(lái)的視頻時(shí)間長(zhǎng)度取其中最短的那個(gè)。
video_with_newAudio.mp4 是你想生成的最終視頻的名字。
Fin
好了,最常用的到這里就可以結(jié)束了,下面的功能基本用不上。
剪輯視頻建議用格式工廠、PR;屏幕錄像建議用OBS。
覺(jué)得有用的話點(diǎn)個(gè)關(guān)注我想要粉絲謝謝

(linux用grep、windows用findstr)該命令可查看到h264的編碼器(compiler)是libx264,也可以看到nvdia顯卡加速的編碼器是h264_nvencffmpeg -i demo.mp4 -c:v libx265 demo.mkv ? ? ? ? ? ?
指定視頻video用h265的編碼器compilerffmpeg -i demo.mkv -c:v copy demo2.mp4 ? ? ? ? ? ?
指定視頻流不再重解碼編碼,節(jié)約時(shí)間,但前提是輸出的容器(mp4)要支持原容器(mkv)里的視頻流的格式ffmpeg -i demo.mp4 -c:v hevc_nvenc -c:a libmp3lame -c:s srt -b_ref_mode 0 demo.mkv
指定nvdia(nv)卡加速視頻編碼,指定音頻編碼器,指定字幕格式srt,如果電腦不支持b模式可以設(shè)為0,輸出為一個(gè)mkv文件ffmpeg -i demo.mp4 -c:v hevc_nvenc -c:a libmp3lame -c:s srt -b_refmode 0 ^(Windows換行繼續(xù)寫(xiě)代碼的符號(hào),linux用\)
More?(這是windows輸入^再按回車后出現(xiàn)的) -map 0:v:0 -map 0:a:0 -map 0:a:1 -map 0:s:0 -map 0:s:1 demo.mkv
一個(gè).mp4,.mkv等文件是一個(gè)容器,里面會(huì)包含若干個(gè)視頻、音頻、字幕、數(shù)據(jù)流。
demo.mp4包含一個(gè)視頻流,兩個(gè)音頻流,兩個(gè)字幕流,該代碼指定這五個(gè)流都轉(zhuǎn)換到demo.mkv中,而非默認(rèn)的只轉(zhuǎn)換三個(gè)流(視頻音頻字幕)
ffmpeg -i demo.mp4 -c:a copy demo.aac (提取出音頻流)
ffmpeg -i demo.mp4 demo.mp3 ?(提取出音頻流)
ffmpeg -i demo.mp4 -s 720x480 -r 20 -b:v 1M demo.mkv ?(指定分辨率,幀率fps,比特率bit/s)
ffmpeg -i demo.mp4 -ss 00:00:03 -t 00:00:02 demo.mkv (從-ss開(kāi)始,截取時(shí)間長(zhǎng)度-t(也可以直接寫(xiě)5,代表5秒)
ffmpeg -i demo.mp4 -ss 00:00:03 -to 00:00:05 demo.mkv ?(和上面一樣的功能,-to是終止時(shí)刻)
ffmpeg -i demo_cn.mp4 -i demo_en.mp4 -i demo_srt_cn.srt -i demo_srt_en.srt
-map 0:v -map 0:a -map 1:a -map 2:s -map 3:s -c:s mov_text demox.mp4
四個(gè)-i輸入,-map匹配:把第一個(gè)輸入的視頻流,第一個(gè)輸入的音頻流,第二個(gè)輸入的音頻流,第三個(gè)輸入的字幕流,第四個(gè)輸入的字幕流,合在一個(gè)mp4容器中輸出,因?yàn)閟rt格式字幕不能直接嵌入mp4,所以用了mov_text這個(gè)字幕編碼器
在(最簡(jiǎn)單的視頻格式轉(zhuǎn)換)的基礎(chǔ)上控制畫(huà)質(zhì):
ffmpeg -i test.avi -c:v libx264 -preset XXX output.mp4
(XXX可以是ultrafast superfast veryfast faster fast medium(默認(rèn)) slow slower veryslow)
越慢,越大,越無(wú)損。砂糖一般用slower
ffmpeg -i test.avi -c:v libx264 -crf 22 output.mp4
(-crf用于視頻壓制(讓視頻體積變?。瑪?shù)值0(無(wú)損)~51(最差質(zhì)量),常用范圍是19~28) 肉眼無(wú)法看出畫(huà)質(zhì)降低的數(shù)值是18,砂糖一般用18
Video Filter:
ffmpeg -i test.avi -c:v libx264 -vf "scale=1920:-1,transpose=2" output.mp4
縮放視頻分辨率到1K,-1是自適應(yīng)高度,transpose=2是逆時(shí)針轉(zhuǎn)90度
ffmpeg -i test.avi -c:v libx264 -vf "crop=400:400:100:100" output.mp4用于視頻裁剪,crop=w:h:x:y ? 代表寬高和位置(左上角為原點(diǎn),→x,↓y)
crop=iw/3:ih/3 ? ? ? ? 代表input width除以3,也就是縮小3倍
合并視頻
mylist.txt:
file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'
ffmpeg -f concat -i mylist.txt -c copy output.mp4
-f 指定接下來(lái)要輸入的文件是一個(gè)視頻列表,concat合并,-i輸入,-c copy表示不用重編碼視頻,因?yàn)槎际且粯拥木幋a,最后輸出合并的視頻。
Audio Filter:
ffmpeg -i test.mp4 -af "volume=1.5" output.mp4 ? (音量增大)
"loudnorm=I=-5:LRA=1" ? ?(統(tǒng)一視頻音量)
"equalizer=f=1000:width_type=h:width=200:g=-10" ? (高通低通濾波器均衡器)
ffmpeg -i test.mp4 -an output.mp4 (刪除音頻流)
-vn 刪除視頻流- sn 刪除字幕流 -dn 刪除數(shù)據(jù)流
創(chuàng)建視頻縮略圖
ffmpeg -i test.mp4 -vf "fps=1/10,scale=-2:720" thumbnail-%03d.jpg
(-2強(qiáng)制自適應(yīng)大小為偶數(shù),因?yàn)榉直媛时仨殲榕紨?shù);fps=1/10即是每十秒輸出一張圖;輸出圖片thumbnail加編號(hào))
(C語(yǔ)言中,% 是格式符的開(kāi)始。d 表示有符號(hào)整數(shù)。3 表示最小輸出3位數(shù)字。0 表示如果數(shù)字不足3位,在左邊用0補(bǔ)成3位。)
添加水印
ffmpeg -i test.mp4 -i cat.jpg -filter_complex "overlay=100:100" output.mp4
把貓圖水印添加到視頻x:y位置,原點(diǎn)左上角
gif制作
gif本身限制,不適合較長(zhǎng)視頻,因此需要先剪切出一個(gè)片段
ffmpet -i test.avi -ss 0 -t 3 -filter_complex [0:v]fps=15,scale=-1:256,split[a][b];[a]palettegen[p];[b][p]paletteuse output.gif
然后用過(guò)濾器縮放視頻并且降低視頻的幀率,
最后spilt...這部分純粹是因?yàn)間if自身256色的限制,需要單獨(dú)創(chuàng)建一個(gè)調(diào)色板。
屏幕錄像
注:別用ffmpeg玩屏幕錄像了,被OBS吊起來(lái)打(指用法方便性上)
ffmpeg -hide_banner -loglevel error -stats -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 2560x1440 -draw_mouse 1 -i desktop -c:v libx264 -r 60 -preset ultrafast -pix_fmt yuv420p -y screen_record2.mp4
輸入q結(jié)束錄制。ctrl+c中斷也行。
占用大小,2K分辨率,一小時(shí)不到1G(個(gè)人估算)
但gdigrab在windows上無(wú)法錄制音頻,還需要安裝兩個(gè)dll:
audio_sniffer.dll和audio_sniffer-x64.dll
可以安裝Screen Capturer Recorder后從軟件目錄拷貝出來(lái)(在vendor/virtual-audio文件夾下)
這個(gè)軟件其實(shí)就是個(gè)內(nèi)置ffmpeg的錄屏軟件。安裝后可以直接打開(kāi)使用(但如果電腦沒(méi)裝java,需要去安裝個(gè)java才能運(yùn)行本軟件)。但這個(gè)軟件雖然用ruby寫(xiě)的但我沒(méi)搞懂怎么用,還是刪了。
找到兩個(gè)dll后,拷貝出來(lái)隨便存到一個(gè)地方,比如C:\ffmpeg-6.0-full_build\virtual-audio\(我自己建的文件夾),用管理員模式打開(kāi)CMD窗口(右鍵點(diǎn)擊win圖標(biāo)),執(zhí)行以下命令(cmd里按右鍵粘貼):
regsvr32 "C:\ffmpeg-6.0-full_build\virtual-audio\audio_sniffer.dll" regsvr32 "C:\ffmpeg-6.0-full_build\virtual-audio\audio_sniffer-x64.dll"
現(xiàn)在可以錄制聲音了。(我忘了到底可不可以了,反正我放棄用ffmpeg錄像,沒(méi)必要)
錄制屏幕+麥克風(fēng)+文字水印
查看設(shè)備名稱:
打開(kāi)CMD窗口,進(jìn)入ffmpeg.exe所在目錄(如果添加過(guò)環(huán)境變量就不用),執(zhí)行以下命令:
ffmpeg -list_devices true -f dshow -i dummy
如果出現(xiàn)中文亂碼,則首先執(zhí)行一下這個(gè)命令:chcp 65001,然后再查看可用設(shè)備。
拷貝水印字體文件:
打開(kāi)C:\Windows\Fonts\目錄,找到微軟雅黑(msyh.ttf),或者自己下載一個(gè)字體
將字體拷貝到ffmpeg所在目錄,例如C:\ffmpeg-6.0-full_build\Yumeko_ziti\msyh.ttf
ffmpeg -f dshow -i audio="麥克風(fēng) (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='冰藍(lán)砂糖':x=50:y=50" -y C:\Users\Yumeko\Videos\luping.mp4
六、錄制屏幕+聲卡+麥克風(fēng)+文字水印 打開(kāi)CMD窗口,執(zhí)行以下命令:
ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="麥克風(fēng) (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='魚(yú)知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4
結(jié)束錄制:
在CMD窗口中輸入q
七、錄制攝像頭+麥克風(fēng)+文字水印 打開(kāi)CMD窗口,執(zhí)行以下命令:
D:\tools\ffmpeg.exe -f dshow -i audio="麥克風(fēng) (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i video="USB2.0 Camera" -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='魚(yú)知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4
結(jié)束錄制:
在CMD窗口中輸入q
八、錄制攝像頭+聲卡+麥克風(fēng)+文字水印 打開(kāi)CMD窗口,執(zhí)行以下命令:
D:\tools\ffmpeg.exe -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="麥克風(fēng) (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i video="USB2.0 Camera" -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='魚(yú)知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4
結(jié)束錄制:
在CMD窗口中輸入q
屏幕錄制
先查看設(shè)備
ffmpeg -list_devices true -f dshow -i dummy
會(huì)出現(xiàn)一堆設(shè)備,它們分別是(以我的為例):
HD Webcam(筆記本攝像頭)
screen-capture-recorder(顯示屏錄像)
麥克風(fēng)(CM383-80864)(USB耳機(jī)) / ? 麥克風(fēng)(Realtek(R) Audio) (3.5mm耳機(jī))
virtual-audio-capturer (系統(tǒng)聲音)
...
錄制視頻(默認(rèn)參數(shù))
桌面:ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4
攝像頭:ffmpeg -f dshow -i video="HD Webcam" v-out2.flv (要根據(jù)自己攝像頭名稱)
錄制聲音(默認(rèn)參數(shù))
系統(tǒng)聲音:ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac
系統(tǒng)+麥克風(fēng)聲音:ffmpeg -f dshow -i audio="麥克風(fēng) (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac
同時(shí)錄制聲音和視頻(默認(rèn)參數(shù))
ffmpeg -f dshow -i audio="麥克風(fēng) (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" av-out.flv
確認(rèn)覆蓋
-y
查看視頻錄制的可選參數(shù)
ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"
播放視頻
ffplay
/**
ffmpeg將視頻分割
ffmpeg命令eg:
ffmpeg -ss 00:00:00 -i test.mp4 -c copy -t ?600 ?output.mp4
此處是將視頻test.mp4從00:00:00處分割600s,分割出的視頻名字是output.mp4
ffmpeg -ss 00:00:00 -t 00:01:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
此處是將視頻test.mp4從00:00:00處分割到01:30處,分割出的視頻名字是output.mp4 *
備注:
有些視頻裁剪后你會(huì)發(fā)現(xiàn)可能開(kāi)始和結(jié)束都不是很準(zhǔn)確,有可能是從00秒開(kāi)始,33秒結(jié)束。
因?yàn)檫@些視頻里30秒處地方剛好不是關(guān)鍵幀,而ffmpeg會(huì)在你輸入的時(shí)間點(diǎn)附近圓整到最接近的關(guān)鍵幀處,然后做接下來(lái)的事情。 *
注釋:
-ss ?指定從什么時(shí)間開(kāi)始分割
-i ? 要分割的視頻文件
-t ? 指定需要截取多長(zhǎng)時(shí)間:
格式如下
-t ?xx ? ? ? ?// 單位 秒,指截取30s
-t ?00:01:30 ?// 時(shí):分:秒,指截取到播放時(shí)間為01:30處
注意 :-ss 要放在 -i 之前
———————————————— 版權(quán)聲明:本文為CSDN博主「Amarao」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/jinmie0193/article/details/94554932
我們可以使用以下的命令格式來(lái)輸出一個(gè)視覺(jué)無(wú)損的視頻:
ffmpeg -i 輸入文件名 -c:v libx265 -x265-params crf=18 output/輸出文件名.mp4
給視頻替換(添加)音軌使用FFmpeg添加、刪除、替換和提取視頻中的音頻 - 知乎 (zhihu.com)
ffmpeg -i video_with_audio.mp4 -i newAudio.wav \
-map 0:0 \
-map 1:0 \
-c:v copy \
-c:a libmp3lame -q:a 1 \
-shortest \
video_with_newAudio.mp4