rodert教你學FFmpeg實戰這一篇就夠了

JavaPub發表於2022-03-18

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安裝

  1. 下載

wget http://ffmpeg.org/releases/ffmpeg-3.4.1.tar.bz2

  1. 解壓

tar -jxvf ffmpeg-3.4.1.tar.bz2

  1. 安裝

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會通知縮放濾鏡在輸出時保持原始的寬高比。

左上角

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

有時候,下載了某個網站的視訊,但是有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`

相關文章