Filtergraph

ffmpeg 命令中,可以使用 -filter-vf-af-filter_complex 选项指定 filter graph

Filtergraph 由 filter chain 组成,语法如下:

filterchain_1;filterchain_2;...

filterchain 由 filter 连接而成,上一个 filter 的输出成为下一个 filter 的输入,语法如下:

filter_1,filter_2,...

filter 语法:

[in_link_1]...[in_link_N]filter_name@id=key1=value1:key2=value2:...[out_link_1]...[out_link_M]

key 可以省略,如果省略,则只能放在具名参数前面,实际参数会根据 filter 的定义分配

如果 value 的值是列表类型,则每个元素由 | 隔开

示例:

fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=1

等价于:

fps=10,scale=width=320:height=-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=1

Video 转 Gif

ffmpeg -ss 1 -t 9 -i foo.mp4 -vf "fps=10,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=1" -loop 0 output.gif

解释:

  • -ss 1: 从输入视频的第 1 秒开始处理。

  • -t 9: 从起始时间起提取 9 秒的内容(即从第 1 秒到第 10 秒)。

  • -i foo.mp4: 指定输入文件为 foo.mp4

  • -vf: 应用视频过滤器,后面跟着过滤器的详细设置。

    过滤器的具体内容是:

    • fps=10: 设置输出 GIF 的帧率为每秒 10 帧。
    • split[s0][s1]: 将视频流分成两个相同的流,分别命名为 s0s1
    • [s0]palettegen=stats_mode=diff[p]: 对第一个流 s0 生成一个调色板 p,使用差异统计模式来优化颜色。
    • [s1][p]paletteuse=dither=bayer:bayer_scale=1: 对第二个流 s1 使用生成的调色板 p,并应用 Bayer 抖动(dithering),使 GIF 的色彩更平滑。
  • -loop 0: 指定 GIF 循环播放,0 表示无限循环。

  • output.gif: 指定输出文件名为 output.gif

filter graph 可视化:

                           [s0]               [p]
input ---> fps ---> split ------> palettegen -----> paletteuse ---> output
| ^
| [s1] |
+---------------------------------+

使用上面的命令创建 GIF 可能会遇到产生出来的 GIF 文件后面几帧有卡顿现象,这时可以使用两步法:

palette="/tmp/palette.png"
filters="fps=10" # 1. 先生成调色板
ffmpeg -v warning -i foo.mp4 -vf "$filters,palettegen" -y $palette
# 2. 再结合调色板生成 GIF
ffmpeg -v warning -i foo.mp4 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.png

参考:

  1. High Quality GIF with FFmpeg
  2. Filtergraph description
  3. palettegen

FFmpeg 视频转 GIF的更多相关文章

  1. c# ffmpeg视频转换

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  2. c# ffmpeg视频转换【转载】

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  3. Android 音视频深入 二十一 FFmpeg视频剪切

    视频剪切我意外的发现上一次的视频压缩的代码能够运行FFmpeg视频剪切的命令,但是不能做视频合并的命令,因为不能读取记录了几个视频的路径的txt文件. 这里我就说直说视频剪切的过程,不说代码,只说lo ...

  4. C# 使用ffmpeg视频截图

    <appSettings> <add key="ffmpeg" value="E:\ffmpeg\ffmpeg-20141012-git-20df026 ...

  5. nginx RTMP FFmpeg 视频直播

    /**************************************************************************** * nginx RTMP FFmpeg 视频 ...

  6. 视频编解码的理论和实践2:Ffmpeg视频编解码

    近几年,视频编解码技术在理论及应用方面都取得了重大的进展,越来越多的人想要了解编解码技术.因此,网易云信研发工程师为大家进行了归纳梳理,从理论及实践两个方面简单介绍视频编解码技术. 相关阅读推荐 &l ...

  7. php ffmpeg视频和序列帧转化

    php ffmpeg视频和序列帧转化 <pre>$cmd=shell_exec("ffmpeg -i ".__DIR__ . "/shipin1.mp4 -r ...

  8. C# ffmpeg 视频处理格式转换具体案例

    C# ffmpeg 视频处理格式转换 C# ffmpeg 视频处理格式转换avi到MP4格式 1.代码如下: using System;using System.Diagnostics; namesp ...

  9. ffmpeg 视频过度滤镜 gltransition

    ffmpeg 视频过度滤镜 gltransition 上次随笔中提到的 ffmpeg-concat 可以处理视频过度,但是缺点是临时文件超大. 经过查找 ffmpeg 还有 gltransition ...

  10. ffmpeg视频格式转换(Java)

    命令: 高品质: ffmpeg -i E:\input\a.wmv -ab 128 -acodec libmp3lame -ac 1 -ar 22050 -r 29.97 -qscale 4 -y E ...

随机推荐

  1. js map方法处理返回数据,获取指定数据简写方法

    map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...

  2. Java解决递归造成的堆栈溢出问题

    在Java中,递归造成的堆栈溢出问题通常是因为递归调用的深度过大,导致调用栈空间不足.解决这类问题的一种常见方法是使用非递归的方式重写算法,即使用迭代替代递归. 1.方法一:非递归的方式重写算法(迭代 ...

  3. 07-canvas绘制虚线

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  4. Linux/Go环境搭建, HelloWorld运行

    package main import "fmt" func main() { fmt.Printf("Hello,World!!!\n") } 以上是Go语言 ...

  5. vs code 快速配置

    1. 基本操作 打开工程文件: ctrl + p 在文件搜索内容: ctrl + shift + f 进入设置: ctrl + shift + p, 然后输入 user setting 添加插件: c ...

  6. JavaScript设计模式样例六 —— 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern) 定义:抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来.或者说,是其他工厂的工厂.目的:提供一个创建一系列相关或 ...

  7. sublime text _正则表达式01

    概述 sublime 常用正则表达式 预备工作:打开sublime之后,ctrl+h,点选使用正则表达式. (\S+) :匹配所有符号外的字符 用到的地方: 小明 小黄 小红 (构造批量插入sql语句 ...

  8. MRO, mixin的解读

    本文试着将python中类继承中方法解析顺序MRO(method resolution order)和mixin梳理清楚 先MARK 类的继承中,super()的使用还是蛮多讲究的,因为看pytorc ...

  9. Spring事务传播机制(最全示例)

    我们在使用Spring框架进行开发时,经常在service层写很多方法,而且这些方法都是带事务的,那么Spring的事务怎么在多个方法之间传播呢?今天我们就仔细聊一聊. Spring的事务传播机制主要 ...

  10. 17 模块subprocess、re

    1. subprocess模块 1.1 概念 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值 简单理解:可以远程连接电脑(socket模块) 1.2 Pop ...