FFmpeg流拼接滤镜concat原理与使用注意事项

Posted Jack_Chai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFmpeg流拼接滤镜concat原理与使用注意事项相关的知识,希望对你有一定的参考价值。

本文出处:http://blog.csdn.net/chaijunkun/article/details/116237809,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

输入流拆分合并原理

对于新手来说,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. 时间基一致

以上是关于FFmpeg流拼接滤镜concat原理与使用注意事项的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg音视频拼接命令

ffmpeg文档19-比特流滤镜

FFmpeg滤镜(1)

FFmpeg中转场滤镜xfade的时间参数(duration和offset)与算法解读

如何在ffmpeg中使用滤镜技术

如何在ffmpeg中使用滤镜技术