天天看點

FFmpeg流拼接濾鏡concat原理與使用注意事項

輸入流拆分合并原理

對于新手來說,concat濾鏡的三個參數:n、v、a會讓人抓不住頭腦,其實在官方文檔中有這麼一句話,描述得已經非常準确了:

There are nx(v+a) inputs: first the inputs for the first segment,

in the same order as the outputs,

then the inputs for the second segment, etc.

下面詳細介紹濾鏡拆分流的工作原理。

首先要說明的是,concat濾鏡先處理視訊流,後處理音頻流。

一個官方的例子來解釋:

ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
  -map '[v]' -map '[a1]' -map '[a2]' output.mkv      

在上述指令中,輸入源有3個,每個輸入源都有1個視訊流和2個音頻流(可以想象為影視劇的兩種語言對白);

concat濾鏡指定了視訊流有1個,是以先選出視訊流[0:0];

而後指定了音頻流有2個,是以後面的[0:1]、[0:2]被選出;

接下來再看n,上述指令配置為3,意味着有3個片段。則輸入流應當有3*(1+2)個流,也就是9個流,并且按照出現的先後順序進行拼接。

即:

(([0:0])([0:1],[0:2])) + (([1:0])([1:1],[1:2])) + (([2:0])([2:1],[2:2]))

==>
[0:0] + [1:0] + [2:0] => [v]
[0:1] + [1:1] + [2:1] => [a1]
[0:2] + [1:2] + [2:2] => [a2]      

需要注意的是,使用一次concat濾鏡同時處理音頻流和視訊流時,兩個(或者多個)輸入源一定要保證拼接的音視訊流數量相等。

并且輸入的流順序要嚴格按照上述規則,不能音視訊流順序颠倒,例如:

[0:v][0:a][1:a][1:v]concat=n=2:v=1:a=1[v][a]      

上述指令中第二個輸入源的音視訊流颠倒了,這樣濾鏡就會認為是

[0:v] + [1:a]      

而這兩個流的類型不一樣,就會報錯:

Stream specifier ':a' in filtergraph description [0:v][0:a][1:a][1:v]concat=n=2:v=1:a=1[v][a] matches no streams      

當然回到最開始的官方例子,每個輸入源有2個音頻流,音頻流的順序可以調換嗎?例如:

[0:1][0:2][1:2][1:1]concat=n=2:v=0:a=2[a1][a2]      

拼接流有哪些先決條件

視訊流拼接的先決條件

  1. 畫面大小一緻
  2. SAR、DAR一緻
  3. 幀率一緻
  4. 時間基一緻

音頻流拼接的先決條件

  1. 采樣率一緻
  2. 時間基一緻