(三)ffmpeg轉(zhuǎn)碼常用容器、編碼格式與解編碼器的搭配總結(jié),-c與-f參數(shù)的運(yùn)用
往期回顧,第二期實(shí)用轉(zhuǎn)碼:(有不懂的都可以在動(dòng)態(tài)評(píng)論問我,私信up不容易看見)

上一期我們留了個(gè)懸念。這期在回答的基礎(chǔ)上,我們將學(xué)會(huì)如何用ffmpeg的編解碼器自由轉(zhuǎn)換常見的音視頻字幕圖像格式,弄懂容器格式、編碼格式、編解碼器之間的搭配關(guān)系。
關(guān)于轉(zhuǎn)碼的總結(jié)
現(xiàn)今常用的一些編碼格式以及它們所支持的容器格式如下:(難免有缺誤等,僅參考)
特別提一點(diǎn),mkv是個(gè)萬能的容器格式。下面說的所有編碼格式,mkv幾乎都能“裝”,就不再列出了。
視頻編碼格式:
h264(又稱mpeg-4 avc、mpeg-4 part 10):mp4、flv、avi、mov、wmv、m4v、f4v、3gp、ts
mpeg4(不只一種,這里指mpeg-4 part 2、divx、xvid):mp4、avi、mov、wmv、m4v、3gp、ts
h265(又稱hevc、mpeg-h part 2):mp4、avi、mov、ts
vp8:avi、wmv、ts、webm
vp9:mp4、avi、wmv、ts、webm
音頻編碼格式:(【】左邊是視頻容器格式,【】右邊是音頻容器格式,*和^后面再說明)
aac:mp4、flv、avi、mov、wmv、3gp、m4v、f4v、ts【】aac、m4a、wma、ac3
mp3:mp4、avi、mov、wmv、f4v、ts【】mp3、wma、ac3
ac-3:mp4、avi*、mov、wmv、m4v、ts【】ac3、m4a、wma
flac:mp4*、avi*、wmv、ts【】flac、m4a、wma、ac3^
vorbis:mp4、avi*、mov、wmv、ts、webm【】ogg、wma、ac3^
opus:mp4*、ts、webm【】ogg、ac3^
(*的意思是需要進(jìn)一步使用相應(yīng)參數(shù),小白不建議)(^的意思是能轉(zhuǎn)碼成功,但很可能播放器不能播放)
(一般聽感來說,上述中opus編碼格式是有損編碼里最好的,其次是vorbis,之后是aac、mp3之類)
(ffmpeg似乎不支持ape容器格式,up想請(qǐng)教大家)
對(duì)新人來說看到這些龐雜的格式可能很懵,通俗說明一下。按照上期“一樣容器能裝不同菜,一樣菜能盛在不同容器”的道理,我們只要找到菜和容器都互相能“接受”的組合就行了。只是視頻是一個(gè)容器兩道菜(畫面和聲音),音頻就一個(gè)容器一道菜。
反之,上面列的這些,也可以理解為視音頻容器格式所支持的編碼格式。上期說一個(gè)視頻有畫面和聲音,那么畫和聲就有它倆各自的編碼格式,所以對(duì)一個(gè)現(xiàn)存的視頻來說,它的容器格式要同時(shí)支持畫和聲的編碼格式。音頻就只有聲音的編碼格式,和它的容器格式互相支持就可以。
這里指出兩點(diǎn)前提:以原文件的編碼為參考,ffmpeg的支持。
雖然有著許多的格式,但目前大多數(shù)視頻的編碼格式是h264和aac,音頻的編碼格式是mp3或aac。因此,只要不同的容器格式之間能同時(shí)支持一樣的編碼格式,就能夠進(jìn)行“高效轉(zhuǎn)碼”。
例如同時(shí)支持h264和aac的有mp4、flv、avi、mov、wmv……滿足這個(gè)前提后,這些容器兩兩之間都可以任意“高效轉(zhuǎn)碼”。可如果像上期說的,只知道容器格式mp4和flv,并不能直接認(rèn)為它倆可以用“-c copy”“高效轉(zhuǎn)碼”。
對(duì)于需要轉(zhuǎn)換編碼格式的音視頻,用ffmpeg的前提是ffmpeg要能支持我們想轉(zhuǎn)的編碼格式。ffmpeg就像一個(gè)批發(fā)中心,但它的貨總歸還是有限的。
不過對(duì)于無需轉(zhuǎn)換編碼格式的情況,即便是ffmpeg不支持的編碼格式,也能用“-c copy”復(fù)制照抄(例如將原視頻轉(zhuǎn)碼成mkv,可理解為原視頻中的編碼格式給ffmpeg提供了個(gè)“模板”),但是如果ffmpeg不支持最后輸出文件的容器格式的話,就不能這樣轉(zhuǎn)碼。
除了音視頻,ffmpeg還可以轉(zhuǎn)碼字幕和圖像文件:
(直接按“輸入→輸出”流程即可,例如ffmpeg -i .\input.png?output.jpg)
(srt轉(zhuǎn)碼ass要注意srt先以記事本打開,另存為將編碼改成UTF-8或unicode)
字幕容器格式:srt、ass、ssa之間兩兩任意互轉(zhuǎn)
圖像容器格式:jpg、jpeg、png、bmp、gif、webp之間兩兩任意互轉(zhuǎn)
-c與-f參數(shù)的運(yùn)用
若要轉(zhuǎn)換編碼格式,我們將運(yùn)用“-c”來使用ffmpeg支持的編解碼器。
“-c”參數(shù)包括了音視頻的全部編解碼器,所以以前的“-c copy”是復(fù)制音視頻編碼的意思。當(dāng)然我們也可以直接用“-c copy”轉(zhuǎn)碼音頻,沒有視頻也沒關(guān)系。
要只對(duì)視頻里的畫面或者聲音進(jìn)行操作的話,我們可以用“-c:v”來限定只處理視頻畫面,“-c:a”來限定只處理視頻里的音頻聲音,“-c:s”來限定只處理字幕。
經(jīng)常用的比如“-c:v libx264”,表示將編碼格式轉(zhuǎn)換成h264;“-c:a libmp3lame”,表示將編碼格式轉(zhuǎn)換成mp3。
這里的“l(fā)ibx264”、“l(fā)ibmp3lame”是編碼器的名字(文末再說編碼器名怎么得知)。簡(jiǎn)單形象地說,“容器格式、編碼格式、編碼器”的一個(gè)可行搭配是“avi、(h264、mp3)、(libx264、libmp3lame)”。
我們也可以用“-c:v h264”、“-c:a mp3”來進(jìn)行上述操作,這樣的話不用知道編碼器名也可以。如下圖:

ffmpeg里的“stream”可以理解為“流”、“軌道”、“通道”。紅圈里的是編碼格式轉(zhuǎn)換的指示說明,從原來的什么轉(zhuǎn)換成什么。例如上圖是,視頻編碼格式從mpeg4轉(zhuǎn)換成h264,視頻里的音頻編碼格式從aac轉(zhuǎn)換成mp3。
我們還可以通過“-f”參數(shù)來進(jìn)行轉(zhuǎn)碼。“-f”,“format,格式”的意思,強(qiáng)制輸出什么格式的文件,讓ffmpeg自行挑選編解碼器進(jìn)行轉(zhuǎn)碼輸出。但只是一般情況來說,就像前面說過ffmpeg的支持也是有限的,不支持的話當(dāng)然也轉(zhuǎn)碼輸出不了。
一般up覺得這個(gè)“-f”可以用來“查詢”自己想轉(zhuǎn)的容器格式是有什么編碼格式或編碼器可以支持。它的用法例如“-f webm”。如下圖:

這說明vp9和opus是webm容器格式支持的編碼格式。
(在一些時(shí)候,用“-f”參數(shù)轉(zhuǎn)碼完的視頻質(zhì)量會(huì)不好,這個(gè)以后再說)
最后說說up一般的轉(zhuǎn)碼思路流程,也許可以給大家提供參考。
①先用命令行ffprobe .\input.mp4
查看文件的編碼格式,如下圖

紅圈表示該視頻的畫面(video)編碼格式是h264,聲音(audio)編碼格式是aac
另外,一般查看文件屬性也可以知道其編碼格式

②確定自己想轉(zhuǎn)的容器或編碼格式
③用“ffmpeg -formats”命令行
查詢ffmpeg支持哪些容器格式。如下圖

demuxing是“解封裝”的意思,muxing是“封裝”的意思,
就像容器格式又稱封裝格式(只是up習(xí)慣叫容器格式,覺得好理解)
轉(zhuǎn)碼也可以看作是封裝,比如小丸里的叫法
解封裝就可以看作是轉(zhuǎn)碼的相反操作
還有,用“ffmpeg -codecs”命令行
查詢ffmpeg支持哪些編碼格式及編解碼器名。如下圖

(容器和編解碼支持的都有很多,不全部截了)
decoder指解碼器名,encoder指編碼器名,以此類推
④輸入相應(yīng)命令行進(jìn)行轉(zhuǎn)碼
好了,轉(zhuǎn)碼算是基本講完了。留下的一些問題,像如何更多地設(shè)置與轉(zhuǎn)碼有關(guān)的參數(shù)以保證畫質(zhì)音質(zhì),咱們兩期后說。下期講剪輯。
感謝你觀看到這里。
(三)ffmpeg轉(zhuǎn)碼常用容器、編碼格式與解編碼器的搭配總結(jié),-c與-f參數(shù)的運(yùn)用的評(píng)論 (共 條)
