寫在前面
如果您對音視頻技術(shù)感興趣,可以訂閱我的專題:
音視頻專輯也可以關(guān)注我的簡書賬戶:
張芳濤,我后期會發(fā)布更多的音視頻以及圖像處理方面的文章。
正文
為了最優(yōu)地使用各種FFmpeg組件,需要正確理解FFmpeg的基本屬性和特性。如果你基礎(chǔ)差了點,看了不知道說的啥,您可以繼續(xù)下一章,并在遇到需要了解的內(nèi)容的時候再回來看。
FFmpeg介紹
FFmpeg是根據(jù)GNU通用公共許可證獲得許可的多媒體處理自由軟件項目的名稱。 該項目最受歡迎的部分是用于視頻和音頻編碼/解碼的ffmpeg命令行工具,其主要特點是速度快,輸出質(zhì)量高和文件大小比較小。 FFmpeg中的“FF”表示 媒體播放器上的表示“快進”的控制按鈕,“mpeg”是Moving Pictures Experts Group的縮寫。 FFmpeg標志包含Z形圖案,這是圖片中以8x8塊圖示的熵編碼方案的特征。
知道FFmpeg圖標啥意思了吧
FFmpeg命令行工具
ffmpeg快速音頻和視頻編碼器/解碼器
ffplay媒體播放器
ffprobe顯示媒體文件的特點
ffserver使用HTTP和RTSP協(xié)議進行多媒體流的廣播服務(wù)器
FFmpeg軟件庫
libavcodec各種多媒體編解碼器的軟件庫
libavdevice軟件庫的設(shè)備
libavfilter軟件庫包含過濾器
libavformat媒體格式的軟件庫
libavutil包含各種實用程序的軟件庫
libpostproc用于后期處理的軟件庫
libswresample用于音頻重采樣的軟件庫
libswscale用于媒體擴展的軟件庫
所有組件的編程語言是C語言,源代碼可以在Linux/Unix、Windows、Mac OS X等系統(tǒng)上編譯。
本書是使用官方二進制版本在Microsoft Windows上創(chuàng)建的,但幾乎所有的指令和示例都應(yīng)該在其他操作系統(tǒng)上無任何更改的情況下運行。 有關(guān)啟用的選項的詳細信息,請參閱
詞匯表中的FFmpeg配置條目。
FFmpeg開發(fā)者
該項目由Fabrice Bellard于2000年開始,F(xiàn)abrice Bellard是QEMU和Tiny C Compiler的創(chuàng)建者,也是一位出色的程序員。 現(xiàn)在該項目由FFmpeg團隊維護,開發(fā)人員來自許多國家,主要的開發(fā)人員可以參與合同工作:
姓名地址專長
Baptiste Coudurier美國.洛杉磯他在廣播codecs (ProRes, DNxHD, IMX/D-10, AVC-Intra),格式(MXF, GXF, MOV)和用法(Avid, FCP, Interlacing, Time Code, Metadata)中有專門的專業(yè)知識
Benjamin Larsson斯德哥爾摩,瑞典他的專業(yè)領(lǐng)域是音頻編解碼器
Diego Biurrun德國亞琛他在許可證法規(guī)遵循工程和構(gòu)建系統(tǒng)方面具有特殊的專長
Jason Garrett-Glaser洛杉磯.美國他是x264的主要開發(fā)人員,在H.264和其他現(xiàn)代有損視頻格式以及x86 SIMD裝配優(yōu)化方面具有特殊的專業(yè)知識
Luca Barbato意大利都靈他在流媒體協(xié)議方面有特殊專長
Michael Niedermayer奧地利的維也納他是視頻編碼和x86匯編領(lǐng)域的專家
Stefano Sabatini卡利亞里.意大利他在libavfilter, ff工具的使用和可用性問題上有特別的專長
參與FFmpeg開發(fā)
任何人都可以通過在網(wǎng)頁上加入特定的郵件列表來參與FFmpeg的開發(fā)和更新:
http://www.ffmpeg.org/contact.html表中列出了可用的郵件列表:
FFmpeg郵件列表
ffmpeg-user對于常見的用戶問題,如編譯問題、命令行問題和類似的問題
ffserver-user對于ffserver用戶的問題,比如配置和流媒體問題
libav-user對于應(yīng)用程序開發(fā)人員有關(guān)使用FFmpeg庫開發(fā)的問題
ffmpeg-devel對于FFmpeg本身的開發(fā),不是為了開發(fā)使用FFmpeg庫的軟件,也不是為了bug報告
ffmpeg-cvslog對于FFmpeg源/主要git存儲庫的所有更改
ffmpeg-trac對于FFmpeg Trac的所有修改
FFmpeg 下載
主要下載來源位于如下網(wǎng)頁:
http://ffmpeg.org/download.htmlWindows的用戶可以從如下網(wǎng)頁下載二進制文件(推薦使用靜態(tài)構(gòu)建):
http://ffmpeg.zeranoe.com/builds許多Linux發(fā)行版已經(jīng)安裝了FFmpeg工具,否則它們可以被編譯,這在OS X上也是可能的,或者OS X二進制文件可以從web頁面下載:
http://www.evermeet.cx/ffmpeg or
http://ffmpegmac.net命令行語法
ffmpeg命令行工具的語法相對簡單,重要的是在正確的位置鍵入所需的參數(shù),而不是在各種輸入和輸出之間混合選項。ffmpeg命令的一般結(jié)構(gòu)如下,需要注意的是全局選項影響所有輸入和輸出:
ffmpeg [global options] [input file options] -i input_file [output file options] output_file
FFmpeg語法,大家能看懂不?看不懂的話看看Example,哪一部分是全局的設(shè)置選項,哪一部分是第一個視頻的設(shè)置選項,所有的結(jié)構(gòu)都是這種模式,看多了就可以了
Windows命令提示符及其替代方法
Windows上的ffmpeg命令行工具是通過命令提示符來管理的,可以通過Windows ->所有程序->附件->命令提示。它也可以從一個快捷方式Win+R開始,然后鍵入cmd,然后輸入。
Windows命令提示符在關(guān)閉時不會保存所使用的命令的歷史,因為有一些具有額外特性的免費應(yīng)用程序,如文件管理、編輯、宏、FTP客戶端等,建議選擇高級的FFmpeg工具程序。下一個表描述了幾種免費的替代方案。
Windows命令提示符選擇
名稱下載描述
FAR Manager
farmanager.com- 文件管理器與shell,編輯器,ftp客戶端
- 命令行完成,快捷鍵,宏,插件
- 兩個窗口,可定制的界面
PyCmd
sourceforge.net/projects/pycmd- 選項卡完成,持續(xù)的歷史……
Console
sourceforge.net/projects/console- 多個標簽,可配置
Gregs DOS Shell
gammadyne.com/cmdline.htm#gs- 改進編輯,命令歷史,支持Aero Glass等
TCC/LE
jpsoft.com/all- downloads/downloads.html- 包括111個內(nèi)部命令,103個內(nèi)部變量,140個變量函數(shù)
接下來的行描述了最好的替代FAR管理器,在Linux上它可以用一個類似的應(yīng)用程序Midnight Commander替代,如果安裝了它,它將從控制臺的mc命令啟動。
FAR Manager是一個受歡迎的文件管理器、編輯器和FTP客戶端,它支持宏、插件和其他高級特性。用戶界面是高度可定制的,并被翻譯成多種語言。下一幅圖展示了它的命令歷史窗口,它在輸入新命令時顯示,因此用戶可以輕松地選擇之前使用的命令并最終編輯它。
對于其高級文件編輯器,在創(chuàng)建ffmpeg批處理時,F(xiàn)AR Manager會很有用,這在
批處理文件章節(jié)中有介紹。 還需要文件編輯器來將媒體文件包含在網(wǎng)頁中-
“網(wǎng)絡(luò)視頻”章節(jié)的主題。 界面的自定義開始于F9鍵并支持選擇選項選項卡。路徑設(shè)置
將下載的FFmpeg命令行實用程序(ffmpeg.exe,ffplay.exe,ffprobe.exe)復(fù)制到環(huán)境變量Path部分中包含的目錄是可以實現(xiàn)的,因此可以從任何目錄調(diào)用它們而無需編寫他們完整的路徑。
或者,您可以將FFmpeg程序復(fù)制到其他目錄,例如C:\ media,然后通過控制面板 - >系統(tǒng)和安全 - >系統(tǒng) - >高級系統(tǒng)設(shè)置將此文件夾添加到系統(tǒng)路徑。 請點擊環(huán)境變量按鈕,向下滾動系統(tǒng)變量的滾動條,點擊路徑,然后點擊編輯按鈕。 在彈出的窗口中單擊編輯系統(tǒng)變量變量值字段,將光標移動到行尾,添加文本
;C:\media
點擊OK按鈕。分號分隔特定的目錄,別復(fù)制。
對于命令提示符的當(dāng)前會話,可以使用命令設(shè)置路徑:
set path=%path%;C:\path_to_ffmpeg.exe
例如,如果文件ffmpeg.exe被復(fù)制到目錄C:\media,命令是:
set path=%path%;C:\media
重命名為縮寫形式(懶人專區(qū))
命令名稱ffmpeg有6個字符,如果每次用的話都輸入"ffmpeg"這六個字符就太麻煩了,想個簡單的辦法,建議將文件ffmpeg.exe重命名為f.exe(ffplay.exe至fp.exe等)或類似的簡寫形式以保存 時間并防止被誤認。 在命令提示符中,你可以使用以下命令:
ren ffmpeg.exe f.exe
為了清晰起見,本書總是使用完整的命令形式ffmpeg。
顯示輸出預(yù)覽
在各種視頻測試中,我們可以通過直接在屏幕上顯示命令輸出來節(jié)省大量時間,而不是將其保存到文件中,也不是在媒體播放器中預(yù)覽。
FFplay媒體播放器預(yù)覽
使用簡化的命令,而不是使用ffmpeg工具生成一個新文件。
ffmpeg -i input_file ... test_options ... output_file
我們可以使用將顯示與ffmpeg完全相同的ffplay,使用該命令保存到文件中
ffplay -i input_file ... test_options
使用SDL輸出設(shè)備預(yù)覽。
此預(yù)覽由表中描述的SDL(簡單的DirectMedia層)輸出設(shè)備生成:
輸出設(shè)備:SDL
描述在SDL窗口中顯示視頻流,需要安裝libsdl庫
語法[-icon_title i_title] [-window_size w_size] [-window_title w_title] -f sdl output
描述設(shè)備的選擇
icon_title名稱為iconified SDL窗口,默認值為window_title值
window_sizeSDL窗口大小,widthxheight或縮寫,默認是輸入視頻的大小
window_title窗口標題,默認為輸出設(shè)備指定的文件名
請注意,SDL設(shè)備只能顯示具有yuv420p像素格式的輸出,并且使用其他輸入類型的選項-pix_fmt具有一個值yuv420p必須被預(yù)先處理,否則會顯示一個錯誤,例如:
ffmpeg -f lavfi -i rgbtestsrc -pix_fmt yuv420p -f sdl Example
可以在FFmpeg中使用的SI前綴
當(dāng)指定數(shù)值各種ffmpeg選項如比特率或最大文件大小可以使用常見的SI后綴:K:千(103),M為百萬(106),G十億(10^ 9),等下一個示例指定一個新的比特率1.5 mbps的輸出文件,所有命令給相同的結(jié)果:
ffmpeg -i input.avi -b:v 1500000 output.mp4ffmpeg -i input.avi -b:v 1500K output.mp4ffmpeg -i input.avi -b:v 1.5M output.mp4ffmpeg -i input.avi -b:v 0.0015G output.mp4
請注意,在FFmpeg文檔中,SI前綴被稱為后綴,因為它們必須在數(shù)值之后立即輸入。
后綴B(字節(jié))可以在ffmpeg選項中使用數(shù)值,并將數(shù)值乘以8。它可以與其他前綴相結(jié)合,以表示千字節(jié)(KB)、兆字節(jié)(MB)等。例如,為輸出文件設(shè)置10兆字節(jié)的最大文件大小,可以使用下一個命令:
ffmpeg -i input.mpg -fs 10MB output.mp4
這種嵌套的表格類型好像在簡書上做不出來
FFmpeg的代碼轉(zhuǎn)換
ffmpeg程序讀入內(nèi)存中指定的任意數(shù)量的輸入的內(nèi)容,根據(jù)輸入的參數(shù)或程序的默認值對其進行處理,并將結(jié)果寫入任意數(shù)量的輸出。輸入和輸出可以是計算機文件、管道、網(wǎng)絡(luò)流、抓取設(shè)備等。
在代碼轉(zhuǎn)換過程中,ffmpeg在libavformat庫中調(diào)用demuxers來讀取輸入,并從數(shù)據(jù)包中獲取編碼數(shù)據(jù)。如果有更多的輸入,ffmpeg可以通過跟蹤任何活動輸入流的最低時間戳來保持它們的同步。然后解碼器從編碼的數(shù)據(jù)包中生成未壓縮的幀,在可選的過濾后,幀被發(fā)送到編碼器。編碼器產(chǎn)生新的編碼包,它被發(fā)送到muxer并寫入到輸出。
FFmpeg工具的重要部分是過濾器,它可以被組織成過濾鏈和filtergraphs。Filtergraphs可以是簡單的或復(fù)雜的。在解碼源和編碼輸出之間實現(xiàn)濾波處理。轉(zhuǎn)碼過程在下一個圖中說明。
FFmpeg的代碼轉(zhuǎn)換
Filters, filterchains,filtergraphs
在多媒體處理中,術(shù)語過濾器是指在編碼到輸出之前修改輸入的軟件工具。過濾器分為音頻和視頻過濾器(請參閱詞匯表中的過濾器)。FFmpeg內(nèi)置了許多多媒體過濾器,可以通過多種方式組合它們。具有復(fù)雜語法的命令根據(jù)指定的參數(shù)從一個過濾器到另一個過濾器。這簡化了媒體處理,因為有有損壓縮的媒體流的多譯碼和編碼會降低整體質(zhì)量。FFmpeg的過濾API(應(yīng)用程序編程接口)是libavfilter軟件庫,它允許過濾器有多個輸入和輸出。過濾器包括在輸入和輸出之間使用-vf選項的視頻過濾器和-af選項音頻過濾器。例如,下一個命令生成一個測試模式順時針旋轉(zhuǎn)90°使用轉(zhuǎn)置過濾器(7中描述。章):
ffplay -f lavfi -i testsrc -vf transpose=1
下一個示例使用atempo音頻過濾器將輸入音頻的速度降低到80%:
ffmpeg -i input.mp3 -af atempo=0.8 output.mp3
過濾器通常用于filterchains(逗號分隔的過濾器序列)和filtergraphs(分號分隔的filterchains序列)。如果使用了任何空格,那么filterchain必須用引號括起來。在filtergraphs中,可以使用表示所選filterchain輸出的鏈接標簽,并可以在以下的filtergraphs中使用。例如,我們希望將輸入視頻與hqdn3d過濾器輸出的輸出進行比較。如果沒有filtergraphs,我們必須至少使用兩個命令,例如:
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4
使用帶有鏈接標簽的filtergraph,就只有一個命令:
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
分割過濾器將輸入分為2個輸出標簽[a]和[b],然后將[a]鏈接用作第二個filterchain的輸入,它為標記[a]的比較創(chuàng)建了一個pad。[b]鏈接被用作第三個filterchain的輸入,它創(chuàng)建一個標記為[b]的輸出。最后一個filterchain使用[A]和[B]標簽作為覆蓋過濾器的輸入,從而產(chǎn)生最終的比較。另一個例子是在下一個圖中。
選擇的媒體流
一些媒體容器如AVI、Matroska、MP4等可以包含多種類型的流,F(xiàn)Fmpeg可以識別5種流類型:音頻(a)、附件(t)、數(shù)據(jù)(d)、字幕(s)和視頻(v)。
使用-map選項選擇流,然后使用流說明符和語法:
file_number:stream_type[:stream_number]
File_number和stream_number也表示為file_index和stream_index,從0開始計數(shù),這意味著第一個是0,第二個是1,等等。
-map 0選擇所有類型的所有流。
-map i:v從文件中選擇所有的視頻流,用i (index), -map i:a選擇所有的音頻流,-map i:s選擇所有字幕流,等等。
特殊選項- - -vn, -sn分別排除所有音頻、視頻或字幕流。
如果輸入文件包含更多相同類型的流,而-map選項不被使用,那么選擇的是每種類型的1個流。例如,如果文件包含2個視頻流,選擇的是具有較高分辨率的,對于音頻選擇的流有更多的通道,等等,細節(jié)如下圖所示:
除了特定的-map選項,流指定符還與許多其他選項一起使用:
流的形式說明符
說明符形式描述
stream_index選擇該索引的流(編號)
stream_type[:stream_index]stream_type為字母a(音頻)、d(數(shù)據(jù))、s(字幕)、t(附件)或v(視頻);如果添加了stream_index,它將選擇該類型的流并使用給定的索引,否則它將選擇該類型的所有流
p:program_id[:stream_index]如果添加了stream_index,那么使用給定的program_id在程序中選擇帶有stream_index的流,否則將選擇該程序中的所有流
stream_id按格式指定的ID選擇流
例如,為了設(shè)置音頻和視頻的使用-b選項的比特率,我們可以使用以下命令:
ffmpeg -i input.mpg -b:a 128k -b:v 1500k output.mp4
Lavfi虛擬設(shè)備
在前面的部分中,我們使用了一個帶有l(wèi)avfi值的-f選項,其中l(wèi)avfi是在表中描述的libavfilter虛擬輸入設(shè)備的名稱:
輸入設(shè)備:lavfi
描述從filtergraph的打開的輸出pad中處理數(shù)據(jù),對于每個輸出墊創(chuàng)建一個對應(yīng)的流,映射到編碼。filtergraph由一個-graph選項指定,目前只支持視頻輸出墊
語法-f lavfi [-graph[ -graph_file]]
lavfi選項的描述
-graph作為輸入的filtergraph,每個視頻的開放輸出必須用一個“outN”形式的唯一字符串標記,其中N是一個數(shù)字,從0開始,對應(yīng)于設(shè)備生成的映射的輸入流。第一個未標記的輸出將自動分配給“out0”標簽,但是其他所有的輸出都需要顯式指定。如果沒有指定,則默認為輸入設(shè)備指定的文件名
-graph_filefiltergraph的文件名被讀取并發(fā)送到其他過濾器,filtergraph的語法與選項-graph指定的語法相同
Lavfi通常用于顯示測試模式,例如帶有命令的SMPTE條:
ffplay -f lavfi -i smptebars
其他經(jīng)常使用的源是可以用命令顯示的顏色源:
ffplay -f lavfi -i color=c=blue
顏色名稱
一些視頻過濾器和源有一個顏色參數(shù),需要指定需要的顏色,并且有4種顏色規(guī)范的方法(默認值為黑色):
1.顏色被指定為W3C(萬維網(wǎng)聯(lián)盟)標準名稱,以其十六進制值按字母順序排列的標準名稱的列表如下圖所示。請注意,這里有幾個同義詞:aqua = cyan, fuchsia = magenta和gray = grey。
2.顏色被指定為十六進制數(shù)的形式0 xrrggbb @AA,RR紅色通道,GG是綠色通道和BB是藍色通道,例如0 x0000ff是藍色的,0 xffff00是黃色的,等等。(@AA)是一個可選的alpha通道,指定有多少不透明的顏色,顏色在通道與一個@符號字符。Alpha通道值要么是從0x00到0xff的十六進制數(shù)字,要么是介于0.0和1.0之間的十進制數(shù),其中0.0 (0x00)是完全透明的,1.0 (0xff)是完全不透明的。例如,半透明度的綠色是0x00ff00@0.5。
3。和之前的方法一樣,但表示十六進制數(shù)字系統(tǒng)使用#符號而不是0 x前綴,一樣在HTML代碼中,例如# ff0000是紅色的,# ffffff是白色的,等等。請注意,#前綴不能使用alpha通道,這意味著# 0000 ff@0x34是好的,但沒有# 0000 ff@ # 34。
4.顏色是用一個特殊的值隨機指定的,結(jié)果是由計算機產(chǎn)生的隨機顏色。