rodert教你學(xué)FFmpeg實(shí)戰(zhàn)這一篇就夠了

rodert教你學(xué)FFmpeg實(shí)戰(zhàn)這一篇就夠了
建議收藏,以備查閱
pdf閱讀版: 鏈接:https://pan.baidu.com/s/11kIaq5V6A_pFX3yVoTUvzA 提取碼:java
@
rodert教你學(xué)FFmpeg實(shí)戰(zhàn)這一篇就夠了
前言
1. 簡(jiǎn)介
2. 安裝
2.1. windows安裝
2.2. linux安裝
3. 命令行操使用
前言
todo
有人問(wèn)rodert哥這篇文章干貨有多干,問(wèn)就是,硌牙。
ffmpeg有多強(qiáng)大,我想你都知道了,現(xiàn)在很多市場(chǎng)上的剪輯軟件都是基于它做的,只是加了一些包裝。讀完本篇,你會(huì)發(fā)現(xiàn)一切如此簡(jiǎn)單。
1. 簡(jiǎn)介
官網(wǎng)地址:https://trac.ffmpeg.org/wiki
FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫(kù)libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開(kāi)發(fā)的。
FFmpeg在Linux平臺(tái)下開(kāi)發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個(gè)項(xiàng)目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開(kāi)發(fā)人員都來(lái)自MPlayer項(xiàng)目,而且當(dāng)前FFmpeg也是放在MPlayer項(xiàng)目組的服務(wù)器上。項(xiàng)目的名稱(chēng)來(lái)自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"。
2. 安裝
2.1. windows安裝
2.2. linux安裝
下載
wget http://ffmpeg.org/releases/ffmpeg-3.4.1.tar.bz2
解壓
tar -jxvf ffmpeg-3.4.1.tar.bz2
安裝
yum install yasm
cd ffmpeg-3.4.1
./configure --enable-shared ?--prefix=/usr/local/ffmpeg
make && make install
編譯時(shí)間較長(zhǎng)
修改文件/etc/ld.so.conf 中增加/usr/local/ffmpeg/lib
使其生效:ldconfig
加入環(huán)境變量:vim /etc/profile
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=
PATH
配置生效: source /etc/profile
3. 命令行操使用
3.1.簡(jiǎn)單說(shuō)明
在操作前,簡(jiǎn)單介紹一下常用指令
ffmpeg的使用方式:?
ffmpeg?[options]?[[infile?options]?-i?infile]...?{[outfile?options]?outfile}...
常用參數(shù)說(shuō)明:?
主要參數(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?不處理音頻
3.2.視頻剪切
3.2.1.掐頭去尾
ffmpeg -ss 00:00:15 -t 00:00:06 -i input.mp4 -vcodec copy -acodec copy output.mp4
剪輯原視頻input.mp4,15s開(kāi)始向后6s,保存到output.mp4
-ss 表示開(kāi)始切割時(shí)間,-t 表示要切多少
3.2.2.
3.3.視頻格式轉(zhuǎn)換
準(zhǔn)確來(lái)說(shuō),是視頻容器轉(zhuǎn)換
ffmpeg -i input.avi output.mp4
avi文件轉(zhuǎn)為mp4
ffmpeg -i input.mp4 output.ts
mp4文件轉(zhuǎn)為ts
3.4.提取音頻
ffmpeg -i JavaPub講壇.mp4 -acodec copy -vn output.aac
提取JavaPub講壇.mp4音頻到output.acc,acc是一種常見(jiàn)默認(rèn)視頻,也可以轉(zhuǎn)為其他格式?;蛘叻乐钩霈F(xiàn)異常,直接使用下面方式
ffmpeg -i JavaPub講壇.mp4 -acodec aac -vn output.aac
3.5.提取音頻
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
純視頻
3.6.碼率控制
碼率控制對(duì)于在線(xiàn)視頻比較重要。因?yàn)樵诰€(xiàn)視頻需要考慮其能提供的帶寬?,F(xiàn)在這個(gè)直播使用很廣泛的時(shí)代
碼率是什么:
bitrate = file size / duration
比如一個(gè)文件20.8M,時(shí)長(zhǎng)1分鐘,那么,碼率就是: biterate = 20.8M bit/60s = 20.810241024*8 bit/60s= 2831Kbps 一般音頻的碼率只有固定幾種,比如是128Kbps, 那么,video的就是 video biterate = 2831Kbps -128Kbps = 2703Kbps。
控制碼率主要還是為了縮小文件大小,盡量不影響分辨率
ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate
-b:v 控制平均碼率
比如一個(gè)視頻源的碼率太高了,有10Mbps,文件太大,想把文件弄小一點(diǎn),但是又不破壞分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
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)單了,在線(xiàn)視頻有時(shí)候,希望碼率波動(dòng),不要超過(guò)一個(gè)閾值,可以設(shè)置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
3.7. 視頻編碼格式轉(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
3.8. 只提取視頻ES數(shù)據(jù)
這個(gè)是不常用的,更多閱讀下面鏈接
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
更多:http://www.360doc.com/content/13/0829/15/13084517_310733557.shtml
3.9.過(guò)濾器的使用
3.9.1. 將輸入的1920x1080縮小到960x540輸出
fmpeg -i input.mp4 -vf scale=960:540 output.mp4`
//ps: 如果540不寫(xiě),寫(xiě)成-1,即scale=960:-1, 那也是可以的,ffmpeg會(huì)通知縮放濾鏡在輸出時(shí)保持原始的寬高比。
3.9.2.視頻添加logo
左上角
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
右上角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
3.9.3.去掉視頻的logo
有時(shí)候,下載了某個(gè)網(wǎng)站的視頻,但是有l(wèi)ogo很煩,咋辦?有辦法,用ffmpeg的delogo過(guò)濾器。 語(yǔ)法:-vf delogo=x:y:w:h[:t[:show]] x:y 離左上角的坐標(biāo) w:h logo的寬和高 t: 矩形邊緣的厚度默認(rèn)值4 show:若設(shè)置為1有一個(gè)綠色的矩形,默認(rèn)值0。
ffmpeg?-i?input.mp4?-vf?delogo=0:0:220:90:100:1?output.mp4
處理后的視頻樣式是在過(guò)濾處加磨砂處理,并加綠色邊框
3.10.抓取視頻的一些幀,存為jpeg圖片
視頻抽取一些幀作為圖片時(shí)很常用的操作。
情況一
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒幾幀, -q:v表示存儲(chǔ)jpeg的圖像質(zhì)量,一般2是高質(zhì)量。
假設(shè)60s,會(huì)保存60張圖片。
情況二
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
ffmpeg會(huì)從input.mp4的第20s時(shí)間開(kāi)始,往下10s,即20~30s這10秒鐘之間,每隔1s就抓一幀,總共會(huì)抓10幀。
情況三
ffmpeg -i input.mp4 -vf "select=between(n,84,208)*not(mod(n,4))" -vsync 0 image_%05d.jpg
主體是一個(gè)select 的過(guò)濾語(yǔ)句:
其中:between(n,*) 是指 從第幾幀到第幾幀之間進(jìn)行提取...
not(mode(n, K))是指每隔幾幀輸出一幀。
3.11.查詢(xún)操作
3.11.1.查詢(xún)視頻總幀數(shù)
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
說(shuō)明:讀取幀數(shù)需要文件解碼,時(shí)長(zhǎng)取決于文件大小
-v error:這隱藏了“info”輸出(版本信息等),使解析更容易。 -count_frames:計(jì)算每個(gè)流的幀數(shù),并在相應(yīng)的流部分中報(bào)告。 -select_streams v:0 :僅選擇視頻流。 -show_entries stream = nb_read_frames :只顯示讀取的幀數(shù)。 -of default = nokey = 1:noprint_wrappers = 1 :將輸出格式(也稱(chēng)為“writer”)設(shè)置為默認(rèn)值,不打印每個(gè)字段的鍵(nokey = 1),不打印節(jié)頭和頁(yè)腳(noprint_wrappers = 1)。
3.11.2.查詢(xún)FFmpeg軟件信息
version?顯示版本
demuxers?顯示可用的demuxers
muxers?顯示可用的muxers
devices?顯示可用的設(shè)備
codecs?顯示所有編解碼器
decoders?顯示可用編解碼器
encoders?顯示所有編碼器
bsfs?顯示比特流filter
formats?顯示可用的格式
protocols?顯示可用的協(xié)議
filters?顯示可用的過(guò)濾器
pix_fmts?顯示可用的像素格式
sample_fmts?顯示可用的采樣格式
layouts?顯示channel名稱(chēng)
colors?顯示識(shí)別的顏色名稱(chēng)
ffmpeg -version
3.12.錄制
查詢(xún)有哪些設(shè)備
ffmpeg?-f?avfoundation?-list_devices?true?-i?""
錄屏
ffmpeg?-f?avfoundation?-i?1?-r?30?out.yuv
-f 指定使用 avfoundation 采集數(shù)據(jù)。 -i 指定從哪兒采集數(shù)據(jù),它是一個(gè)文件索引號(hào)。在我的MAC上,1代表桌面(可以通過(guò)上面的命令查詢(xún)?cè)O(shè)備索引號(hào))。 -r 指定幀率。按ffmpeg官方文檔說(shuō)-r與-framerate作用相同,但實(shí)際測(cè)試時(shí)發(fā)現(xiàn)不同。-framerate 用于限制輸入,而-r用于限制輸出。 注意,桌面的輸入對(duì)幀率沒(méi)有要求,所以不用限制桌面的幀率。其實(shí)限制了也沒(méi)用。
錄屏+聲音
ffmpeg?-f?avfoundation?-i?1:0?-r?29.97?-c:v?libx264?-crf?0?-c:a?libfdk_aac?-profile:a?aac_he_v2?-b:a?32k?out.flv
-i 1:0 冒號(hào)前面的 “1” 代表的屏幕索引號(hào)。冒號(hào)后面的"0"代表的聲音索相號(hào)。 -c:v 與參數(shù) -vcodec 一樣,表示視頻編碼器。c 是 codec 的縮寫(xiě),v 是video的縮寫(xiě)。 -crf 是 x264 的參數(shù)。 0 表式無(wú)損壓縮。 -c:a 與參數(shù) -acodec 一樣,表示音頻編碼器。 -profile 是 fdk_aac 的參數(shù)。 aac_he_v2 表式使用 AAC_HE v2 壓縮數(shù)據(jù)。 -b:a 指定音頻碼率。 b 是 bitrate的縮寫(xiě), a是 audio的縮與。
錄視頻
ffmpeg?-framerate?30?-f?avfoundation?-i?0?out.mp4
-framerate 限制視頻的采集幀率。這個(gè)必須要根據(jù)提示要求進(jìn)行設(shè)置,如果不設(shè)置就會(huì)報(bào)錯(cuò)。 -f 指定使用 avfoundation 采集數(shù)據(jù)。 -i 指定視頻設(shè)備的索引號(hào)。
錄音
ffmpeg?-f?avfoundation?-i?:0?out.wav
3.13.直播相關(guān)
推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName`
拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv`
轉(zhuǎn)流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream`
實(shí)時(shí)推流
ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room`