從流的操作(一)視頻轉(zhuǎn)音頻引發(fā)的血案一文中我們了解到,流的選擇盆驹,實(shí)際有兩種方式圆丹,一種是ffmpeg自動(dòng)選擇,一種是設(shè)置參數(shù)手動(dòng)選擇躯喇。
對(duì)于自動(dòng)選擇辫封,ffmpeg默認(rèn)選擇規(guī)則如下:
- 視頻流:默認(rèn)選擇分辨率最高的流
- 音頻流:默認(rèn)選擇通道最多的流
- 字幕流:默認(rèn)選擇第一個(gè)字幕編碼器支持的字幕流
對(duì)于視頻流和音頻流,如果分辨率相等或者通道相等則以第一個(gè)為準(zhǔn)廉丽,數(shù)據(jù)流和附件流不支持自動(dòng)選擇秸讹,需要手動(dòng)選擇。
自動(dòng)選擇的情況下雅倒,ffmpeg每種類型只會(huì)選擇一路璃诀,舉個(gè)例子
ffmpeg -i r3.mp4 -hide_banner
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r3.mp4':
...
Duration: 00:00:58.54, start: 0.000000, bitrate: 1998 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1732 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
Stream #0:2(und): Audio: mp3 (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
注:Stream #0:0,第一個(gè)0表示第一個(gè)輸入文件蔑匣,第二個(gè)0表示第一個(gè)輸入文件的第一路流
如果我們直接對(duì) r3.mp4 轉(zhuǎn)碼操作劣欢,你會(huì)發(fā)現(xiàn)輸出的視頻只保留了一路視頻和一路音頻。
1裁良、ffmpeg -i r3.mp4 tmp-r3.mp4
2凿将、ffmpeg -i tmp-r3.mp4
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 544x960, 1684 kb/s, 29.83 fps, 29.83 tbr, 11456 tbn, 59.67 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 129 kb/s (default)
這就是ffmpeg自動(dòng)選擇的結(jié)果。
如果想要輸入視頻的Stream #0:2這路音頻流价脾,就只能手動(dòng)指定了牧抵。
流的手動(dòng)模式,使用 -map 參數(shù)操作,-map 非常重要犀变,后面我們還會(huì)反復(fù)使用它妹孙。它表示我們需要從輸入文件中選擇哪些流到輸出文件。
語(yǔ)法規(guī)則:
-map [-]input_file_index[:stream_type_specifier][:stream_index]
- 中括號(hào)[]表示可選获枝,input_file_index 之前的 - 表示反選蠢正,即可以剔除某一路流。
- input_file_index 指的是某個(gè)輸入文件省店,我們可以用下標(biāo)0表示第一個(gè)輸入文件嚣崭,1表示第二個(gè)輸入文件,以此類推懦傍;
- stream_type_specifier (可選)指的是指定輸入文件的某路流的類型雹舀,我們用 a、v粗俱、s葱跋、d、t分別表示音頻流源梭、視頻流娱俺、字幕流、數(shù)據(jù)流和附件流废麻;
- stream_index(可選)指的是具體的某個(gè)類型的某路流荠卷。
我們?nèi)匀灰?a target="_blank">案例一的素材視頻為例(沒(méi)有下載的可以點(diǎn)擊這里下載。
如果我們以r1ori.mp4為輸入烛愧,想得到r3.mp4的結(jié)果油宜,即多了一路音頻流且是mp3格式的,怎么做怜姿?
ffmpeg -i r1ori.mp4 -map 0:v -map 0:a:0 -map 0:a:0 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4
注意輸出代碼段Stream mapping這一段
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))
簡(jiǎn)單分析下
- 因?yàn)橹挥幸粋€(gè)輸入文件慎冤,所以-map的第一個(gè)參數(shù)都是0
- -map 0:v 表示選擇輸入文件的所有視頻流(這里視頻流只有一個(gè))到輸出,-c:v copy表示復(fù)制所有的視頻流沧卢,即你看到的 Stream #0:0 -> #0:0 (copy)
- -map 0:a:0 我們寫了兩遍蚁堤,第一個(gè)表示選擇輸入文件的第一個(gè)音頻流到輸出,第二個(gè)仍然表示選擇輸入文件的第一個(gè)音頻流到輸出但狭,相當(dāng)于輸出了兩路音頻流
- -map 0:v -map 0:a:0 -map 0:a:0 連起來(lái)也有關(guān)系披诗,表示要按照我們選擇的這三路順序輸出
- -c:a:0 copy 針對(duì)第一個(gè)音頻流進(jìn)行復(fù)制,不重新編碼立磁,即 Stream #0:1 -> #0:1 (copy)呈队; -c:a:1 libmp3lame 針對(duì)第二個(gè)音頻流使用libmp3lame編碼器重新編碼,即輸出過(guò)程中的 Stream #0:1 -> #0:2 (aac (native) -> mp3 (libmp3lame))
后面我們還會(huì)大量使用-map命令唱歧,所以上面這段分析宪摧,務(wù)必要理解清楚。
上面的命令同樣等價(jià)于
ffmpeg -i r1ori.mp4 -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 copy -c:a:1 libmp3lame -y r3.mp4
-map 0:v 這里等價(jià)于 -map 0:0,-map 0:a:0 等價(jià)于-map 0:1,這是因?yàn)樵趓1ori.mp4中#0:0就是視頻流得运,#0:1就是音頻流
ffmpeg -i r1ori.mp4
...
Stream #0:0(und): Video: h264
Stream #0:1(und): Audio
...
注意:-map的參數(shù),針對(duì)的是輸入流饱搏,因?yàn)槭俏覀兿胍獜妮斎肓髦羞x擇流到輸出;-c選項(xiàng)的參數(shù)鬓催,針對(duì)的并不再是輸入流了宇驾,-c的參數(shù)針對(duì)的是-map選擇的流,即輸出流筝尾。
除此之外,下面我們?cè)倏磶讉€(gè)簡(jiǎn)單的例子贸街,你可以在看結(jié)果之前嘗試下
1、復(fù)制輸入文件的所有流到輸出,輸出結(jié)果可就不止只有兩路流了
ffmpeg -i r3.mp4 -map 0 -c copy output.mp4
2娇跟、把輸入文件的三路流分別拆開盹沈,輸出三個(gè)文件
ffmpeg -y -i r3.mp4 -map 0:v -c:v copy output-silent.mp4 \
-map 0:a:0 -c:a copy output-audio.aac \
-map 0:a:1 -c:a copy output-audio.mp3
我們還可以設(shè)置一些選項(xiàng),比如可以設(shè)置r3.mp4的兩路音頻流有不同的碼率。
ffmpeg -i r3.mp4 -b:a:0 32k -b:a:1 64k -map 0 -y r4.mp4
-map 0 是必須的关串,不然輸出結(jié)果并不會(huì)輸出兩路音頻流。
對(duì)于音視頻流還有很多選項(xiàng)設(shè)置,具體你可以查閱官方文檔了解趴拧,你也可以在我們平時(shí)練習(xí)中多查閱資料,奠定基礎(chǔ)。
最后问麸,我們還有一種最最常見的操作——結(jié)合濾鏡使用布轿。
比如把原視頻 r3.mp4 等比例縮放一倍
ffmpeg -i r3.mp4 -vf scale=272:480 -y filter.mp4
我們也可以手動(dòng)選擇流處理
ffmpeg -i r3.mp4 -filter_complex "[0]scale=272:480[out]" -map 0:a -map "[out]" -y filter.mp4
上面這兩條命令你可能很難理解福铅,關(guān)于濾鏡环揽,大家先有個(gè)印象秧了,下面文章我們?cè)僮髟敿?xì)介紹衡创。
流的操作我們就介紹到這里,大家在練習(xí)中碰到各種莫名其妙的問(wèn)題晶通,盡管留言璃氢。