(二)如何理解ffmpeg的命令行,-i與-c參數(shù)介紹,高效轉(zhuǎn)碼的一些實用知識
往期回顧,第一期啟蒙篇:(有不懂的都可以在動態(tài)評論問我,私信up不容易看見)

按上期的命令行轉(zhuǎn)碼成功的小伙伴可能會覺得很驚訝,為什么這么快就能轉(zhuǎn)碼完?而且質(zhì)量也非常好,似乎沒有任何損失。上次我也說了其實一些轉(zhuǎn)碼軟件都可以做到這樣的,所以這一期up會通俗地來解釋說明。
但在這之前,up先說明一下上次用到的ffmpeg的兩個參數(shù),以及ffmpeg命令行的基本邏輯。
就是說,“ffmpeg -i”和“-c copy”這兩個東東是啥意思?ffmpeg的命令行怎么寫?一條命令行怎么去理解它整個或者每一部分是什么意思?
一、-i與-c參數(shù)的介紹、如何理解命令行
-i
這里先說一點可能一開始會誤解的地方,是“-i”,而不是“ffmpeg -i”。雖然一般來說“ffmpeg”是絕大部分時候ffmpeg命令行的開頭,命令行也經(jīng)常以“ffmpeg -i”的樣子開頭,但它不是后面一定要接上“-i”的(這個例子以后再說)。
“-i”,簡單理解就是“input,輸入”的意思,我要輸入什么文件給ffmpeg,從而讓ffmpeg有個準備去做什么。比如說“ffmpeg -i .\input1.mp4”、“-i .\剛下載的音樂.mp3”、“-i .\做視頻的素材要轉(zhuǎn)碼.mkv”……視頻、音頻、甚至jpg、gif等格式的圖像都可以這么輸入進ffmpeg處理。
有輸入了,那輸出呢?請看下面這個只有輸入和輸出的命令行:(注意命令行里是有空格的?。。?/span>
ffmpeg -i?C:\input.mp4?C:\output.mp4
最后的“.\output.mp4”就是輸出的文件。注意這個命令行是沒有任何我們自己的處理的,這樣的話,ffmpeg會以自己的默認方法來重新渲染!(雖說對于觀看一般也還行,以后再另說)
所以,一般我們用ffmpeg是以“輸入→處理→輸出”的流程來理解,來寫命令行的。像這樣:
ffmpeg -i .\input.mp4?-c copy .\output.mp4
“-c copy”就是指我們給ffmpeg的“處理”這一步。ffmpeg有許許多多用來做“處理”的參數(shù)等,以后慢慢道來,敬請關(guān)注。
-c
“-c”,是“codec,編解碼器”的意思,告訴ffmpeg接下來要用什么編碼器、解碼器。打個歪比方,做一道菜,寫好菜譜給人看就像編碼,按菜譜做好菜就像解碼。簡單來說,對于音視頻圖像,編碼就是,它們要以什么規(guī)則呈現(xiàn),以便我們存儲傳送等操作;解碼就是,它們要按什么規(guī)則來解讀,以便我們最終播放。平時說的“導出視頻”、“渲染視頻”通常就是指“編碼”這一過程。
之前一直提到的“-c copy”是“-c”參數(shù)的一種很經(jīng)常的用法,顧名思義,復制照抄輸入文件原來的編解碼器所做的事。那ffmpeg舒服了,不用自己再來做編解碼什么的。所以,這就是為什么轉(zhuǎn)碼可以這么快的原因。咱能多快好省啊,何必吶。
那就是說,只要在小丸工具箱、格式工廠等其它軟件也做到這點就行,照樣很快轉(zhuǎn)碼。這兩個軟件的下載安裝up不多說了,搜索一下吧。
小丸的轉(zhuǎn)碼做法如下:
很多人尤其小白一開始以為是在“視頻”那里轉(zhuǎn)碼,
那里是一般壓制用的(以后也許會再說)
轉(zhuǎn)碼是在“封裝”這里,如下圖

一樣地單擊按住鼠標,把文件拖進去,或者按“添加”
輸出格式有幾種常見的主流格式,按需選擇
(例如up現(xiàn)在想把mp4轉(zhuǎn)碼成flv)
aac編碼器建議選libfdk_aac
(選另一個aac也行,只是建議用更先進的而已)
最后點擊“封裝”,會彈出旁邊這個命令提示符窗口,很快轉(zhuǎn)碼完了

像這樣,轉(zhuǎn)碼完的文件默認和待轉(zhuǎn)碼文件一個地方
接著是格式工廠的轉(zhuǎn)碼做法:
比如現(xiàn)在想把flv轉(zhuǎn)碼成mp4,就點擊紅圈的這個“mp4”,其它類推不多說了

最關(guān)鍵的是,視頻和音頻這兩個編碼都要選copy
其它直接默認,根本不要改
點擊“確定”,再點“開始”

幾乎瞬間就轉(zhuǎn)碼完了,質(zhì)量完全ok的
(如果不是這樣的話,把全文看完了再問我吧)
最后說一點,在以前的ffmpeg里,“-c copy”是以“-vcodec copy -acodec copy”這種形式表示的。現(xiàn)在的ffmpeg不存在這個問題了,而且這兩種都可以用。
二、如何高效轉(zhuǎn)碼:編碼格式、容器格式的知識
生活總是有些小插曲,教程也是。up先介紹一個特別實用的命令行:
ffprobe .\input.mp4
用于查看文件的詳細信息,比如說一個視頻的編碼格式。簡單理解,“編碼器”就是用來做什么的工具,“編碼格式”就是約定俗成的什么規(guī)則。一個視頻,它有畫面和聲音,我們就是想去知道它的畫面是以什么規(guī)則呈現(xiàn)的,聲音又是以什么另外的規(guī)則去呈現(xiàn)。
下面進入正題。(這一節(jié)狹窄來說和ffmpeg沒啥關(guān)系,算是背景知識。如果明白編碼格式與容器格式的意思和區(qū)別的朋友可以直接一鍵三連到這已經(jīng)算看完啦,感謝?。?/p>
up這里有一個在b站客戶端下載的視頻:

可以看到,這個是blv格式的視頻,畫面的編碼格式是h264,聲音的編碼格式是aac
(還有許多其它的信息,以后會慢慢說明)
現(xiàn)在我們先知道一點:mp4格式的畫面、聲音編碼格式也是h264、aac
那就容易想到,我們可以直接用上一期的轉(zhuǎn)碼命令行
把blv轉(zhuǎn)碼成mp4,實現(xiàn)這種高效超快的轉(zhuǎn)碼

可能有人會想問,最高效的轉(zhuǎn)碼難道不是直接改文件名嗎?比如我有個視頻“input.flv”,直接把它后綴改成“.mp4”不就行了嗎,照樣能播放啊。
播放是能播放,但是這里不是因為“轉(zhuǎn)碼成功了”,而是因為你的播放器是真的強大,它的“菜譜”實在是多,轉(zhuǎn)不轉(zhuǎn)碼它都能拿來做好菜,成功播放。例如up在用的potplayer,還有其它像暴風影音、kmplayer、vlc media player等(up沒試過這些,就懶得試了明白道理就行)
但有些播放器比如Windows 10自帶的“電影與電視”就不能播放flv,直接改后綴沒用的。如果就是要播放flv視頻,要不就給它外加更多的編解碼器“菜譜”,要不就選用其它的播放器。
所以有一個疑問:按之前的道理,那么flv和mp4這兩個視頻格式,編解碼照著copy轉(zhuǎn)碼成功了,畫面和聲音都應(yīng)該是一樣的編碼格式吧?欸,確實如此(僅這個例子來說,下期再做說明)。那為什么有的播放器能播放mp4又不能播放flv?
這里就是我們所說的“編碼格式”和“容器格式”的概念和區(qū)別了。之前說編解碼,我們看著菜譜做得一手好菜,那這菜還得拿東西盛著不是?這個用來盛放的東西就是“容器”,而“容器”又有它們各自不同的樣子。
因此,“容器格式”簡單來說,就是什么樣子的“容器”。比如mp4、flv、mkv、avi……它們又叫“封裝格式”,這就是我們平常說的“視頻格式”、“視頻是什么格式”。(其實一開始明白這個的話在小丸那里我們就知道怎么轉(zhuǎn)碼了)
可規(guī)則是,一樣的容器它可以裝不同的菜,一樣的菜也可以盛在不同的容器里。
所以說,所謂“高效轉(zhuǎn)碼”就是利用了編碼格式相同而容器格式又不同這一點,轉(zhuǎn)換的只是容器格式。
那有沒有什么規(guī)則給我們參考,哪些容器格式可以允許我們做“高效轉(zhuǎn)碼”?如果不允許,我們又該怎么去轉(zhuǎn)換編碼格式呢?且看下期分解。
感謝你觀看到這里。