寫在前面如果您對音視頻技術(shù)感興趣,可以訂閱我的專題:音視頻專輯 正文為了最優(yōu)地使用各種FFmpeg組件,需要正確理解FFmpeg的基本屬性和特性。如果你基礎(chǔ)差了點(diǎn),看了不知道說的啥,您可以繼續(xù)下一章,并在遇到需要了解的內(nèi)容的時(shí)候再回來看。 FFmpeg介紹FFmpeg是根據(jù)GNU通用公共許可證獲得許可的多媒體處理自由軟件項(xiàng)目的名稱。 該項(xiàng)目最受歡迎的部分是用于視頻和音頻編碼/解碼的ffmpeg命令行工具,其主要特點(diǎn)是速度快,輸出質(zhì)量高和文件大小比較小。 FFmpeg中的“FF”表示 媒體播放器上的表示“快進(jìn)”的控制按鈕,“mpeg”是Moving Pictures Experts Group的縮寫。 FFmpeg標(biāo)志包含Z形圖案,這是圖片中以8x8塊圖示的熵編碼方案的特征。 知道FFmpeg圖標(biāo)啥意思了吧
FFmpeg命令行工具
FFmpeg軟件庫
所有組件的編程語言是C語言,源代碼可以在Linux/Unix、Windows、Mac OS X等系統(tǒng)上編譯。 本書是使用官方二進(jìn)制版本在Microsoft Windows上創(chuàng)建的,但幾乎所有的指令和示例都應(yīng)該在其他操作系統(tǒng)上無任何更改的情況下運(yùn)行。 有關(guān)啟用的選項(xiàng)的詳細(xì)信息,請參閱詞匯表中的FFmpeg配置條目。 FFmpeg開發(fā)者該項(xiàng)目由Fabrice Bellard于2000年開始,F(xiàn)abrice Bellard是QEMU和Tiny C Compiler的創(chuàng)建者,也是一位出色的程序員。 現(xiàn)在該項(xiàng)目由FFmpeg團(tuán)隊(duì)維護(hù),開發(fā)人員來自許多國家,主要的開發(fā)人員可以參與合同工作:
參與FFmpeg開發(fā)任何人都可以通過在網(wǎng)頁上加入特定的郵件列表來參與FFmpeg的開發(fā)和更新:
FFmpeg 下載主要下載來源位于如下網(wǎng)頁: 命令行語法ffmpeg命令行工具的語法相對簡單,重要的是在正確的位置鍵入所需的參數(shù),而不是在各種輸入和輸出之間混合選項(xiàng)。ffmpeg命令的一般結(jié)構(gòu)如下,需要注意的是全局選項(xiàng)影響所有輸入和輸出:
FFmpeg語法,大家能看懂不?看不懂的話看看Example,哪一部分是全局的設(shè)置選項(xiàng),哪一部分是第一個(gè)視頻的設(shè)置選項(xiàng),所有的結(jié)構(gòu)都是這種模式,看多了就可以了
Windows命令提示符及其替代方法Windows上的ffmpeg命令行工具是通過命令提示符來管理的,可以通過Windows ->所有程序->附件->命令提示。它也可以從一個(gè)快捷方式Win+R開始,然后鍵入cmd,然后輸入。 Windows命令提示符在關(guān)閉時(shí)不會(huì)保存所使用的命令的歷史,因?yàn)橛幸恍┚哂蓄~外特性的免費(fèi)應(yīng)用程序,如文件管理、編輯、宏、FTP客戶端等,建議選擇高級的FFmpeg工具程序。下一個(gè)表描述了幾種免費(fèi)的替代方案。 Windows命令提示符選擇
接下來的行描述了最好的替代FAR管理器,在Linux上它可以用一個(gè)類似的應(yīng)用程序Midnight Commander替代,如果安裝了它,它將從控制臺(tái)的mc命令啟動(dòng)。 FAR Manager是一個(gè)受歡迎的文件管理器、編輯器和FTP客戶端,它支持宏、插件和其他高級特性。用戶界面是高度可定制的,并被翻譯成多種語言。下一幅圖展示了它的命令歷史窗口,它在輸入新命令時(shí)顯示,因此用戶可以輕松地選擇之前使用的命令并最終編輯它。 對于其高級文件編輯器,在創(chuàng)建ffmpeg批處理時(shí),F(xiàn)AR Manager會(huì)很有用,這在批處理文件章節(jié)中有介紹。 還需要文件編輯器來將媒體文件包含在網(wǎng)頁中-“網(wǎng)絡(luò)視頻”章節(jié)的主題。 界面的自定義開始于F9鍵并支持選擇選項(xiàng)選項(xiàng)卡。 路徑設(shè)置將下載的FFmpeg命令行實(shí)用程序(ffmpeg.exe,ffplay.exe,ffprobe.exe)復(fù)制到環(huán)境變量Path部分中包含的目錄是可以實(shí)現(xiàn)的,因此可以從任何目錄調(diào)用它們而無需編寫他們完整的路徑。 或者,您可以將FFmpeg程序復(fù)制到其他目錄,例如C:\ media,然后通過控制面板 - >系統(tǒng)和安全 - >系統(tǒng) - >高級系統(tǒng)設(shè)置將此文件夾添加到系統(tǒng)路徑。 請點(diǎn)擊環(huán)境變量按鈕,向下滾動(dòng)系統(tǒng)變量的滾動(dòng)條,點(diǎn)擊路徑,然后點(diǎn)擊編輯按鈕。 在彈出的窗口中單擊編輯系統(tǒng)變量變量值字段,將光標(biāo)移動(dòng)到行尾,添加文本
點(diǎn)擊OK按鈕。分號分隔特定的目錄,別復(fù)制。 對于命令提示符的當(dāng)前會(huì)話,可以使用命令設(shè)置路徑:
例如,如果文件ffmpeg.exe被復(fù)制到目錄C:\media,命令是:
重命名為縮寫形式(懶人專區(qū))命令名稱ffmpeg有6個(gè)字符,如果每次用的話都輸入"ffmpeg"這六個(gè)字符就太麻煩了,想個(gè)簡單的辦法,建議將文件ffmpeg.exe重命名為f.exe(ffplay.exe至fp.exe等)或類似的簡寫形式以保存 時(shí)間并防止被誤認(rèn)。 在命令提示符中,你可以使用以下命令:
為了清晰起見,本書總是使用完整的命令形式ffmpeg。 顯示輸出預(yù)覽在各種視頻測試中,我們可以通過直接在屏幕上顯示命令輸出來節(jié)省大量時(shí)間,而不是將其保存到文件中,也不是在媒體播放器中預(yù)覽。 FFplay媒體播放器預(yù)覽使用簡化的命令,而不是使用ffmpeg工具生成一個(gè)新文件。
我們可以使用將顯示與ffmpeg完全相同的ffplay,使用該命令保存到文件中
使用SDL輸出設(shè)備預(yù)覽。此預(yù)覽由表中描述的SDL(簡單的DirectMedia層)輸出設(shè)備生成: 輸出設(shè)備:SDL
描述設(shè)備的選擇
請注意,SDL設(shè)備只能顯示具有yuv420p像素格式的輸出,并且使用其他輸入類型的選項(xiàng)-pix_fmt具有一個(gè)值yuv420p必須被預(yù)先處理,否則會(huì)顯示一個(gè)錯(cuò)誤,例如:
可以在FFmpeg中使用的SI前綴當(dāng)指定數(shù)值各種ffmpeg選項(xiàng)如比特率或最大文件大小可以使用常見的SI后綴:K:千(103),M為百萬(106),G十億(10^ 9),等下一個(gè)示例指定一個(gè)新的比特率1.5 mbps的輸出文件,所有命令給相同的結(jié)果:
請注意,在FFmpeg文檔中,SI前綴被稱為后綴,因?yàn)樗鼈儽仨氃跀?shù)值之后立即輸入。 后綴B(字節(jié))可以在ffmpeg選項(xiàng)中使用數(shù)值,并將數(shù)值乘以8。它可以與其他前綴相結(jié)合,以表示千字節(jié)(KB)、兆字節(jié)(MB)等。例如,為輸出文件設(shè)置10兆字節(jié)的最大文件大小,可以使用下一個(gè)命令:
這種嵌套的表格類型好像在簡書上做不出來
FFmpeg的代碼轉(zhuǎn)換ffmpeg程序讀入內(nèi)存中指定的任意數(shù)量的輸入的內(nèi)容,根據(jù)輸入的參數(shù)或程序的默認(rèn)值對其進(jìn)行處理,并將結(jié)果寫入任意數(shù)量的輸出。輸入和輸出可以是計(jì)算機(jī)文件、管道、網(wǎng)絡(luò)流、抓取設(shè)備等。 在代碼轉(zhuǎn)換過程中,ffmpeg在libavformat庫中調(diào)用demuxers來讀取輸入,并從數(shù)據(jù)包中獲取編碼數(shù)據(jù)。如果有更多的輸入,ffmpeg可以通過跟蹤任何活動(dòng)輸入流的最低時(shí)間戳來保持它們的同步。然后解碼器從編碼的數(shù)據(jù)包中生成未壓縮的幀,在可選的過濾后,幀被發(fā)送到編碼器。編碼器產(chǎn)生新的編碼包,它被發(fā)送到muxer并寫入到輸出。 FFmpeg工具的重要部分是過濾器,它可以被組織成過濾鏈和filtergraphs。Filtergraphs可以是簡單的或復(fù)雜的。在解碼源和編碼輸出之間實(shí)現(xiàn)濾波處理。轉(zhuǎn)碼過程在下一個(gè)圖中說明。 FFmpeg的代碼轉(zhuǎn)換
Filters, filterchains,filtergraphs在多媒體處理中,術(shù)語過濾器是指在編碼到輸出之前修改輸入的軟件工具。過濾器分為音頻和視頻過濾器(請參閱詞匯表中的過濾器)。FFmpeg內(nèi)置了許多多媒體過濾器,可以通過多種方式組合它們。具有復(fù)雜語法的命令根據(jù)指定的參數(shù)從一個(gè)過濾器到另一個(gè)過濾器。這簡化了媒體處理,因?yàn)橛杏袚p壓縮的媒體流的多譯碼和編碼會(huì)降低整體質(zhì)量。FFmpeg的過濾API(應(yīng)用程序編程接口)是libavfilter軟件庫,它允許過濾器有多個(gè)輸入和輸出。過濾器包括在輸入和輸出之間使用-vf選項(xiàng)的視頻過濾器和-af選項(xiàng)音頻過濾器。例如,下一個(gè)命令生成一個(gè)測試模式順時(shí)針旋轉(zhuǎn)90°使用轉(zhuǎn)置過濾器(7中描述。章):
下一個(gè)示例使用atempo音頻過濾器將輸入音頻的速度降低到80%:
過濾器通常用于filterchains(逗號分隔的過濾器序列)和filtergraphs(分號分隔的filterchains序列)。如果使用了任何空格,那么filterchain必須用引號括起來。在filtergraphs中,可以使用表示所選filterchain輸出的鏈接標(biāo)簽,并可以在以下的filtergraphs中使用。例如,我們希望將輸入視頻與hqdn3d過濾器輸出的輸出進(jìn)行比較。如果沒有filtergraphs,我們必須至少使用兩個(gè)命令,例如:
使用帶有鏈接標(biāo)簽的filtergraph,就只有一個(gè)命令:
分割過濾器將輸入分為2個(gè)輸出標(biāo)簽[a]和[b],然后將[a]鏈接用作第二個(gè)filterchain的輸入,它為標(biāo)記[a]的比較創(chuàng)建了一個(gè)pad。[b]鏈接被用作第三個(gè)filterchain的輸入,它創(chuàng)建一個(gè)標(biāo)記為[b]的輸出。最后一個(gè)filterchain使用[A]和[B]標(biāo)簽作為覆蓋過濾器的輸入,從而產(chǎn)生最終的比較。另一個(gè)例子是在下一個(gè)圖中。 選擇的媒體流一些媒體容器如AVI、Matroska、MP4等可以包含多種類型的流,F(xiàn)Fmpeg可以識別5種流類型:音頻(a)、附件(t)、數(shù)據(jù)(d)、字幕(s)和視頻(v)。 使用-map選項(xiàng)選擇流,然后使用流說明符和語法:
File_number和stream_number也表示為file_index和stream_index,從0開始計(jì)數(shù),這意味著第一個(gè)是0,第二個(gè)是1,等等。
如果輸入文件包含更多相同類型的流,而-map選項(xiàng)不被使用,那么選擇的是每種類型的1個(gè)流。例如,如果文件包含2個(gè)視頻流,選擇的是具有較高分辨率的,對于音頻選擇的流有更多的通道,等等,細(xì)節(jié)如下圖所示: 除了特定的-map選項(xiàng),流指定符還與許多其他選項(xiàng)一起使用: 流的形式說明符
例如,為了設(shè)置音頻和視頻的使用-b選項(xiàng)的比特率,我們可以使用以下命令:
Lavfi虛擬設(shè)備在前面的部分中,我們使用了一個(gè)帶有l(wèi)avfi值的-f選項(xiàng),其中l(wèi)avfi是在表中描述的libavfilter虛擬輸入設(shè)備的名稱:
Lavfi通常用于顯示測試模式,例如帶有命令的SMPTE條:
其他經(jīng)常使用的源是可以用命令顯示的顏色源:
顏色名稱一些視頻過濾器和源有一個(gè)顏色參數(shù),需要指定需要的顏色,并且有4種顏色規(guī)范的方法(默認(rèn)值為黑色):
|
|