FFmpeg流拼接滤镜concat原理与使用注意事项_ffmpeg concat_Jack_Chai的博客-程序员秘密

技术标签: 音视频相关  研究成果  拼接  滤镜  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. 时间基一致
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chaijunkun/article/details/116237809

智能推荐

考CCIE/HCIE,到底是选线上机构,还是选线下机构?_网络工程师俱乐部的博客-程序员秘密

晚上好,我是老杨。3月第二周就这样开始了,老杨明显感觉到和年前截然不同的氛围:年前来要资料包,然后收藏起来放在文件夹吃灰的多;年后来咨询规划、提升、考证相关的,积极性更高。大过年的,我都懂,都懂。但是,对于很多新手来说,光理解考证需要了解的内容,就得花不少功夫。比如: 考IE线上机构还是线下机构好? IE可以自学吗?资料包看不懂怎么办? 考完我能拿到多少薪资?投入产出比是多少? ​编辑添加图片注释,不超过 140 字(可选)今天这篇文章,就给

html弹出隐藏url和标题的窗口,关于js 中 alert 事件弹框提示,title显示页面url网址问题..._Forever snow的博客-程序员秘密

未重写之前: 会显示当前网站的url作为title主题 可利用 js 对alert进行重写。只可去掉url主题,不可自定义。代码如下 :js代码:window.alert = function(msg, callback) {var div = document.createElement("div");div.innerHTML= ""+ ".nbaMask { position: fixed;...

给定一个数组,根据数组名求数组的长度_如何通过数组名判断数组长度_bian_qing_quan11的博客-程序员秘密

题目:给定一个数组,如何根据数组名求数组的长度?本题来自于一个同学笔试题,笔试中是实现一个冒泡排序,但是排序的参数只有一个数组名,没有数组中元素的个数;void bubbleSort(int a[]);思路:要先实现这个冒泡排序,首先要获取这个数组中数组元素的个数。然后对数组排序,下面说一下如何根据数组名获取一个数组长度。首先我们如果在局部作用域中定义一个数组的话,获取数组中元

Python面向对象编程-类和实例_chaos_oper的博客-程序员秘密

一.面向对象1.概念面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。2.类和对象的关系类是模板,对象是根据这个模板创建出来的类只需要有一个,对象可以有多个(一张图纸可以造多个飞机)3.类:属性(信息)和方法(你能完成的事)1)...

使用http-proxy-middleware报错显示proxy is not a funcion_我的名字豌豆的博客-程序员秘密

前言 下载并使用http-proxy-middleware包时,显示报错,代码如下: const express = require('express'); const proxy = require('http-proxy-middleware') const app = express() app.use(express.static(__dirname + '/')) app.use('/api', proxy({ target: 'http://localhost:40

linux测验-RHCSA模拟测试_chaos_oper的博客-程序员秘密

考试信息:IPADDR: 172.25.254.x(X 在这里指您的工作站编号加100)NETMASK: 255.255.255.0GATEWAY: 172.25.254.250DNS: 172.25.254.250yum源地址为:http://172.25.254.250/rhel7(1)设置IP信息vim /etc/sysconfig/network-scripts/ifcfg-...

随便推点

Arduino UNO + DS1302 + TM1638时间显示+Proteus仿真二_protues tm1638_perseverance52的博客-程序员秘密

Arduino UNO + DS1302 + TM1638时间显示+Proteus仿真带按键切换显示

iOS端引入SJMediaCacheServer缓存库到ijkplayer_老中医治百病的博客-程序员秘密

前两天把android端的播放缓存搞定了,这两天开始着手搞iOS端的播放缓存。由于要支持,github上可供选择的不多,KTVHttpCache stars较多,但仅支持对mp4的本地缓存,这里选择基于KTVHttpCache二开的SJMediaCacheServer作为hls的缓存库。项目计划是将SJMediaCacheServer作为.a文件或framework引入到ijkplayer中,本文介绍编译链接使用SJMediaCacheServer的方法。

asp.net实现一个用户进行注册的时候同时发送一个邮件到注册人的邮箱,通过发送的邮箱链接来激活该帐号_mozheshen的博客-程序员秘密

当一个用户进行注册的时候同时发送一个邮件到注册人的邮箱,通过发送的邮箱链接来激活该帐号,具体用asp.net方法的实现代码,贴在这了,有需要的可以参考! public void SendSMTPEMail(string strSmtpServer, string strFrom, string strFromPass, string strto, string strSubject, stri

php5.3终于支持require_once("/classes/class.php");了_php5.5支持require吗_「已注销」的博客-程序员秘密

require_once("/classes/class.php");这一句,在5.2下提示文件不存在,在5.3下提示正常。这样写清新多了。也可能和PHP版本没关系,和web服务器有关系,不细究了。总之,以前是出错的。现在是正确的。

Linux 学习手记(2):Linux文件系统的基本结构_weixin_33709219的博客-程序员秘密

Linux 文件系统概况Linux文件系统为一个倒置的树状结构,所有文件或文件夹均包含在一个根目录“/”中。如图所示(每个目录的作用可以参考:Linux目录结构说明):Linux系统严格区分大小写所以在Linux中:一个名为“A”的文件夹和一个名为“a”的文件夹是不同的两个文件夹,这点和Windows系统所有不同。查看目录信息每一个She...

angular 6_angular 6 视频_眷恋天空的驴-Anikinly的博客-程序员秘密

$location  absUrl()  绝对地址  path()    跟路由操作是挂钩的,可以设置可以获取 angula下独有的方式,其他很js一样  replace() 就不会出现历史管理,一般不用  hash()  可设置 可获取  search()  可设置 可获取  返回URL中的查询字符串部分   http://www.dreamdu.com/dreamdu.php?id=5&nam

推荐文章

热门文章

相关标签