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. awk批量提取序列

    在提取前需保证序列文件仅有一列! awk '{print$1}' input.fa > ouput.fa#就可将ID后面的其余注释信息去掉,仅保留ID 1 awk -F '>' 'NR=F ...

  2. Java中0.2减0.1 结果为什么不是0.1?

    double 表示这种类型的数值精度是 float 类型的两倍(有人称之为双精度数值).绝大部 分应用程序都采用double 类型.在很多情况下,float 类型的精度很难满足需求.实际上,只 有很少 ...

  3. LaTeX 编译 acmart 文档报错:hyperref must be loaded before hyperxmp.

    在编译一篇从 arXiv 下载的文档时遇到如下错误: Package hyperxmp Error: hyperref must be loaded before hyperxmp. 根据 GitHu ...

  4. 记 Android 部分布局忽然无法显示

    总结:这是一个一开始方向错误的问题 某次,APK在测试手机上正常使用,故换了个荣耀X20的设备,想着兼容性应该没有问题, 结果,忽然发现A页面,一个底部布局无法显示,其它页面这个布局可以显示(使用的i ...

  5. 在.net core使用Serilog,只要简单的三步

    第一步:在项目上用nuget安装 Serilog.AspNetCore 最新的稳定版即可 ,安装这个会把其他需要的包都给包含着 第二步:修改 Program.cs 的 CreateHostBuilde ...

  6. Angular Material 18+ 高级教程 – CDK Drag and Drop

    前言 CDK Drag and Drop 和 CDK Scrolling 都是在 Angular Material v7 中推出的. 它们有一个巧妙的共同点,那就是与 Material Design ...

  7. Angular – Language Service

    介绍 Angular Language Service 是一个针对 Angular 项目的程序静态分析 (Program Static Analysis) 工具,它的作用是提升开发体验. 很多 IDE ...

  8. PTA甲级—树

    1.树的遍历 1004 Counting Leaves (30分) 基本的数据结构--树,复习了链式前向星,bfs遍历判断即可 #include <cstdio> #include < ...

  9. 嵌入式Linux ubi文件系统制作、分区设置、只读文件系统,uboot启动参数root

    当前平台, 基于君正的X10000平台的嵌入式Linux 系统 0  目的 我要设置根文件系统为可读写, 设置data分区上的文件系统为只读 1 设置各文件系统的读写属性 /bin/mount -o ...

  10. Softmax 函数 详解