rodert教你學FFmpeg實戰這一篇就夠了
建議收藏,以備查閱
pdf閱讀版:
連結:https://pan.baidu.com/s/11kIaq5V6A_pFX3yVoTUvzA
提取碼:java
@
前言
todo
有人問rodert哥這篇文章乾貨有多幹,問就是,硌牙。
ffmpeg有多強大,我想你都知道了,現在很多市場上的剪輯軟體都是基於它做的,只是加了一些包裝。讀完本篇,你會發現一切如此簡單。
1. 簡介
官網地址:https://trac.ffmpeg.org/wiki
FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視訊的完整解決方案。它包含了非常先進的音訊/視訊編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec裡很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它作業系統環境中編譯執行,包括Windows、Mac OS X等。這個專案最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer專案,而且當前FFmpeg也是放在MPlayer專案組的伺服器上。專案的名稱來自MPEG視訊編碼標準,前面的"FF"代表"Fast Forward"。
2. 安裝
2.1. windows安裝
2.2. linux安裝
- 下載
- 解壓
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
- 編譯時間較長
修改檔案/etc/ld.so.conf 中增加/usr/local/ffmpeg/lib
使其生效:ldconfig
加入環境變數:vim /etc/profile
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$FFMPEG_HOME/bin:$PATH
配置生效: source /etc/profile
3. 命令列操使用
3.1.簡單說明
在操作前,簡單介紹一下常用指令
ffmpeg的使用方式:
ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
常用引數說明:
主要引數:
-i 設定輸入流
-f 設定輸出格式
-ss 開始時間
視訊引數:
-b 設定視訊流量,預設為200Kbit/s
-r 設定幀速率,預設為25
-s 設定畫面的寬與高
-aspect 設定畫面的比例
-vn 不處理視訊
-vcodec 設定視訊編解碼器,未設定時則使用與輸入流相同的編解碼器
音訊引數:
-ar 設定取樣率
-ac 設定聲音的Channel數
-acodec 設定聲音編解碼器,未設定時則使用與輸入流相同的編解碼器
-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開始向後6s,儲存到output.mp4
-ss 表示開始切割時間,-t 表示要切多少
3.2.2.
3.3.視訊格式轉換
準確來說,是視訊容器轉換
ffmpeg -i input.avi output.mp4
avi檔案轉為mp4
ffmpeg -i input.mp4 output.ts
mp4檔案轉為ts
3.4.提取音訊
ffmpeg -i JavaPub講壇.mp4 -acodec copy -vn output.aac
提取JavaPub講壇.mp4音訊到output.acc,acc是一種常見預設視訊,也可以轉為其他格式。或者防止出現異常,直接使用下面方式
ffmpeg -i JavaPub講壇.mp4 -acodec aac -vn output.aac
3.5.提取音訊
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
純視訊
3.6.位元速率控制
位元速率控制對於線上視訊比較重要。因為線上視訊需要考慮其能提供的頻寬。現在這個直播使用很廣泛的時代
位元速率是什麼:
bitrate = file size / duration
比如一個檔案20.8M,時長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 控制平均位元速率
比如一個視訊源的位元速率太高了,有10Mbps,檔案太大,想把檔案弄小一點,但是又不破壞解析度。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
ffmpeg官方wiki比較建議,設定b:v時,同時加上 -bufsize
-bufsize 用於設定位元速率控制緩衝器的大小,設定的好處是,讓整體的位元速率更趨近於希望的值,減少波動。(簡單來說,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 當然是第二種比較好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就簡單了,線上視訊有時候,希望位元速率波動,不要超過一個閾值,可以設定maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
3.7. 視訊編碼格式轉換
比如一個視訊的編碼是MPEG4,想用H264編碼
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
當然了,如果ffmpeg當時編譯時,新增了外部的x265或者X264,那也可以用外部的編碼器來編碼。(不知道什麼是X265,可以Google一下,簡單的說,就是她不包含在ffmpeg的原始碼裡,是獨立的一個開原始碼,用於編碼HEVC,ffmpeg編碼時可以呼叫它。當然了,ffmpeg自己也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
3.8. 只提取視訊ES資料
這個是不常用的,更多閱讀下面連結
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
更多:http://www.360doc.com/content/13/0829/15/13084517_310733557.shtml
3.9.過濾器的使用
3.9.1. 將輸入的1920x1080縮小到960x540輸出
fmpeg -i input.mp4 -vf scale=960:540 output.mp4`
//ps: 如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比。
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
有時候,下載了某個網站的視訊,但是有logo很煩,咋辦?有辦法,用ffmpeg的delogo過濾器。
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的座標
w:h logo的寬和高
t: 矩形邊緣的厚度預設值4
show:若設定為1有一個綠色的矩形,預設值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
處理後的視訊樣式是在過濾處加磨砂處理,並加綠色邊框
3.10.抓取視訊的一些幀,存為jpeg圖片
視訊抽取一些幀作為圖片時很常用的操作。
- 情況一
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒幾幀, -q:v表示儲存jpeg的影像質量,一般2是高質量。
假設60s,會儲存60張圖片。
- 情況二
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
ffmpeg會從input.mp4的第20s時間開始,往下10s,即20~30s這10秒鐘之間,每隔1s就抓一幀,總共會抓10幀。
- 情況三
ffmpeg -i input.mp4 -vf "select=between(n,84,208)*not(mod(n,4))" -vsync 0 image_%05d.jpg
主體是一個select 的過濾語句:
其中:between(n,*) 是指 從第幾幀到第幾幀之間進行提取...
not(mode(n, K))是指每隔幾幀輸出一幀。
3.11.查詢操作
3.11.1.查詢視訊總幀數
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
說明:讀取幀數需要檔案解碼,時長取決於檔案大小
-v error:這隱藏了“info”輸出(版本資訊等),使解析更容易。
-count_frames:計算每個流的幀數,並在相應的流部分中報告。
-select_streams v:0 :僅選擇視訊流。
-show_entries stream = nb_read_frames :只顯示讀取的幀數。
-of default = nokey = 1:noprint_wrappers = 1 :將輸出格式(也稱為“writer”)設定為預設值,不列印每個欄位的鍵(nokey = 1),不列印節頭和頁尾(noprint_wrappers = 1)。
3.11.2.查詢FFmpeg軟體資訊
version 顯示版本
demuxers 顯示可用的demuxers
muxers 顯示可用的muxers
devices 顯示可用的裝置
codecs 顯示所有編解碼器
decoders 顯示可用編解碼器
encoders 顯示所有編碼器
bsfs 顯示位元流filter
formats 顯示可用的格式
protocols 顯示可用的協議
filters 顯示可用的過濾器
pix_fmts 顯示可用的畫素格式
sample_fmts 顯示可用的取樣格式
layouts 顯示channel名稱
colors 顯示識別的顏色名稱
ffmpeg -version
3.12.錄製
查詢有哪些裝置
ffmpeg -f avfoundation -list_devices true -i ""
錄屏
ffmpeg -f avfoundation -i 1 -r 30 out.yuv
-f 指定使用 avfoundation 採集資料。
-i 指定從哪兒採集資料,它是一個檔案索引號。在我的MAC上,1代表桌面(可以通過上面的命令查詢裝置索引號)。
-r 指定幀率。按ffmpeg官方文件說-r與-framerate作用相同,但實際測試時發現不同。-framerate 用於限制輸入,而-r用於限制輸出。
注意,桌面的輸入對幀率沒有要求,所以不用限制桌面的幀率。其實限制了也沒用。
錄屏+聲音
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 冒號前面的 “1” 代表的螢幕索引號。冒號後面的"0"代表的聲音索相號。
-c:v 與引數 -vcodec 一樣,表示視訊編碼器。c 是 codec 的縮寫,v 是video的縮寫。
-crf 是 x264 的引數。 0 表式無失真壓縮。
-c:a 與引數 -acodec 一樣,表示音訊編碼器。
-profile 是 fdk_aac 的引數。 aac_he_v2 表式使用 AAC_HE v2 壓縮資料。
-b:a 指定音訊位元速率。 b 是 bitrate的縮寫, a是 audio的縮與。
錄視訊
ffmpeg -framerate 30 -f avfoundation -i 0 out.mp4
-framerate 限制視訊的採集幀率。這個必須要根據提示要求進行設定,如果不設定就會報錯。
-f 指定使用 avfoundation 採集資料。
-i 指定視訊裝置的索引號。
錄音
ffmpeg -f avfoundation -i :0 out.wav
3.13.直播相關
推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName`
拉流儲存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv`
轉流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream`
實時推流
ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room`