美文网首页Android技术知识Android知识Android开发
FFmpeg命令行语法之-filter_complex (And

FFmpeg命令行语法之-filter_complex (And

作者: 书柜里的松鼠 | 来源:发表于2017-05-15 23:16 被阅读5748次

    废话少说,先举个例子

    ffmpeg -i input.mp4 -i image1.png -i image2.png -filter_complex  [1:v]scale=100:100[img1];[2:v]scale=1280:720[img2];[0:v][img1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0 -y output.mp4
    

    这个例子其实在android端使用ffmpeg给视频添加图片水印里已经说过了。
    这是一个给视频打上图片水印的命令。
    然而,他打的不是一个普通的水印,而是两个。
    命令看上去很简洁。然而(又是然而),正因为他这么简洁,所以一开始上来未免搞不清他实际是什么意思。

    来,我们把他拆开,其实他由以下部分组成:

    //1.起始
    ffmpeg
    
    //2.输入
    -i input.mp4//这个是原始文件
    
    -i image1.png//第一个水印图片
    
    -i image2.png//第二个水印图片
    
    //3.滤镜
    -filter_complex  [1:v]scale=100:100[img1];[2:v]scale=1280:720[img2];[0:v][img1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0
    
    //4.输出
    -y output.mp4//输出文件
    

    1、2、4部分的含义一目了然。3里头的scale和overlay也是字面的意思,不难理解。然而,-filter_complex滤镜的参数结构就不是那么好理解了,比如说那一坨[]里头的东西是什么鬼?

    来,一个个解释。
    [1:v]这个里头两个参数,1表示的是操作对象的编号。在本例中0就是原始视频文件input.mp4,1就是image1.png,2就是image2.png,3就是output.mp4。而另一个参数v表示操作对象里的视频信息。
    [img1]是这个操作过滤器的名字。(当然名字可以随便起)
    所以这头一句[1:v]scale=100:100[img1]的意思就是对图片imagei.png进行调节尺寸的操作,并将这个操作的结果命名为img1。后面的[2:v]和[img2]也是一个意思。
    我们继续,overlay前面[0:v][img1]凑一起是什么意思呢。0自然就是指的原始视频,这句的意思就是将[img1]叠加到0对象的视频上。本例中就是把image1.png叠加到input.mp4上。这里需要注意的就是顺序:后一个对象叠加到前一个上,后一个对象在上层。如果写成[img1][0:v],那相对本例其实就是把视频叠加到图片imge1.png上。这样的话一般来说由于视频通常是全屏,等于用视频覆盖了图片,水印完全看不到了。
    好,我们又把这个操作的结果命名为[bkg],那么接下来[bkg][img2]的意思就很明了了。就是把image2.png再叠加上去,image2.png是在最上层的,如果位置重合的话,他会遮盖 image1.png的水印。
    于是,事就这样成了。


    加个餐

    1.水印的移动:
    这里需要用到时间参数。
    比如:overlay=0+t*20:0
    这里在x坐标上加上了+t*10,于是水印就会慢慢向右边移动。

    2.特定时间显示水印:
    这次不仅要用到时间参数,还要用上条件语句。

    overlay=x='if(gte(t,2),10,NAN)':(main_h-overlay_h)/2
    

    if条件语句的基本结构就是

    if(条件,条件为true时的值,条件为false时的值)
    

    再来看看计算表达式。
    这里用到了表达式gte(x,y)。如果x大于等于y则表达式的值为1,反之为0。
    所以if(gte(t,2),10,NAN)的意思就是,当时间大于等于2秒时,水印x位置为10,反之不显示水印。(或者你也可以用lte来判断“小于或等于”)
    要了解所有表达式的话,可以去啃一下ffmpeg官方文档的Expression Evaluation部分。


    参考:
    ffmpeg 基本用法大全
    ffmpeg Documentation

    相关文章

      网友评论

        本文标题:FFmpeg命令行语法之-filter_complex (And

        本文链接:https://www.haomeiwen.com/subject/fjlkxxtx.html