1 FFmpeg的由來
FFmpeg縮寫中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的縮寫。官網:ffmpeg.org
編譯好的可執行程序也可以從官網上下載。當然你也可以自己搭建編譯環境編譯。
2 FFmpeg命令行工具
主要包括:
- ffmpeg 快速的音頻、視頻編碼器/解碼器
- ffplay 多媒體播放器
- ffprobe 多媒體文件特征解析
同時FFmpeg編譯之后包含libavcodec、libavformat、libavdevice、libavfilter、libavutil、libpostproc、libswresample、libswscale。
3 ffmpeg命令行格式
ffmpeg.exe [global options] [input file options] -i input_file [output file options] output_files
[]表示可選的參數
4 ffplay命令行格式
ffplay和ffmpeg命令行參數一致,只是ffplay沒有輸出相關的參數。
比如: ffmpeg -i input_file ... test_options ... output_files
使用ffplay可以直接預覽
ffplay -i input_file ... test_options
5 ffmpeg中數值前綴或后綴語法
ffmpeg中表示數字可以使用K、M、G形式的后綴,分別表示千、兆、吉;默認是10進制的,可以使用后綴B表示以2為單位的KB、MB、GB等。比如在設置轉碼率的時候可以使用下面幾種形式表示視頻編碼碼率為1.5Mb:
ffmpeg -i input.avi -b:v 1500000 output.mp4
ffmpeg -i input.avi -b:v 1500K output.mp4
ffmpeg -i input.avi -b:v 1.5M output.mp4
ffmpeg -i input.avi -b:v 0.015G output.mp4
設置轉碼碼率為10MB,形式如下:
ffmpeg -i input.mpg -b:v 10MB output.mp4
7 ffmpeg轉碼及filter
ffmpeg轉碼的基本邏輯是如下圖所示:
_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| | v _________ | | | decoded | | frames | |_________| ________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________|
ffmpeg從輸入文件(input_file)中通過解復用器(demuxer,包含在libavformat庫中)讀取到壓縮之后的編碼數據(encoded data);壓縮的數據通過解碼器(decoder)的解碼,還原為原始的數據(decoded frame,音頻PCM、視頻YUV),這些數據可作為filter的輸入;原始音視頻數據通常可以直接傳遞給編碼器(encoder),輸出編碼后的數據(encoded packet,重新編碼),這個過程也可以省略;通過復用器(muxer)的處理輸出指定的封裝格式。
這里提到filter的概念,在ffmpeg的轉碼過程中filter是最復雜的。多個filter可以構成filterchain,使用逗號分隔;多個filterchain可以構成filtergraph,用分號分隔。filtergraph分為簡單和復雜兩種。簡單的filtergraph通常是可以線形順序描述的filtergraph,比如下圖:
_______ _____________ _______ ________ | | | | | | | | | input | ---> | deinterlace | ---> | scale | ---> | output | |_______| |_____________| |_______| |________|
復雜的filtergraph通常是具有多個輸入輸出文件,並有多條執行路徑。比如下面的例子,
_________ | | | input 0 |\ __________ |_________| \ | | \ _________ /| output 0 | \ | | / |__________| _________ \| complex | / | | | |/ | input 1 |---->| filter |\ |_________| | | \ __________ /| graph | \ | | / | | \| output 1 | _________ / |_________| |__________| | | / | input 2 |/ |_________|
filter在實際使用中語法如下:(注意區分,前面是輸出標簽,后面是輸出標簽)
[in_label1][in_label2][...] filter_name=parameters [out_label1][out_label2][...]
舉例說明下,先看下面語法:
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
最終的filter是這樣的:
[a] [a]pad=2*iw[A] [A]
split overlay=w
[b] [b]hqdn3d[B] [B]
(后續部分內容會介紹不同的filter語法)
8 Lavfi virtual device
-f表示使用filter,而lavfi是libavfilter virtual input device的別名。其支持的命令行格式如下:
-f lavfi [-graph [-graph_file]]
-graph是作為輸入的filtergraph,graph_file表示filtergraph文件的。
比如下面輸入顯示SMPTE測試圖:
ffplay -f lavfi -i smptebars
9 顏色的表示方法
- 固定的名字(可以查看顏色表),比如red、blue;
- 十六進制的顏色描述0xRRGGBB[@AA],注意透明度A必須是浮點數,范圍[0.0,1.0]或者十六進制描述(0x前綴);
- #RRGGBB@AA,網頁中描述顏色的格式,AA使用十六進制;
- random,系統隨機計算一個顏色;
可以用下面語句驗證下顏色的描述:
ffplay -f lavfi -i color=c=0xff0000@0.5
ffplay -f lavfi -i color=c=blue
ffplay -f lavfi -i color=c=#0000ff@0x80
ffplay -f lavfi -i color=c=random
10 ffmpeg幫助文檔查詢
ffmpeg.exe支持以下命令后綴 -h、-h long、-h topic
ffmpeg -h decoder=decoder_name
ffmpeg -h encoder=encoder_name
- 支持的碼流filter -bsfs
- 可用的編解碼器 -codecs
- 可用的解碼器 -decoders
- 可用解碼器 -encoders
- 可用filter -filters
- 支持的音視頻格式(后綴或文件格式) -formats
- 支持的音頻聲道layout -layouts
- 支持的像素格式 -pix_fmts
- 支持的協議類型 -protocols
- 支持的音頻數字化精度 -sample_fmts
附加說明
本部分內容主要涉及《Ffmpeg Basic》的前兩章,建議認真閱讀下,這將是后續學習和擴展的基礎,不需要全部搞明白,但是需要理解ffmpeg基本的轉碼、和libavfilter的工作原理。
至於ffmpeg的幫助文檔,在需要的時候知道哪里可以找到,可以參考什么就可以了。
參考:http://ffmpeg.org/ffmpeg-filters.html#Filtering-Introduction