FFmpeg 视频转 GIF

news/2024/10/22 18:18:56

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=15,scale=320:-1:flags=lanczos"# 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【八叉树】从上千万个物体中【**瞬间**】就近选取坐标

众里寻他千百度,蓦然回首,那人却在灯火阑珊处前情提要 在某些情况下,我们在场景中创建了数百万个物体,这些物体没有直接的网格或碰撞体(例如,通过GPU绘制的物体),因此无法通过常规的射线检测与碰撞体进行交互。我们仅掌握这些物体的坐标或顶点位置。在这种情况下,我们…

Python 数据分析与可视化有什么区别

在当今的数据驱动时代,Python已成为数据分析和数据可视化的重要工具。尽管这两个领域经常在数据科学项目中相互交织,但它们在功能和目的上存在本质区别。本文旨在详细探讨Python在数据分析和数据可视化方面的差异,包括它们的定义、使用的主要库、应用场景以及在实际项目中的…

python第六章课后习题

点击查看代码print("学号:2023310143028")点击查看代码def prim(graph, start): num_nodes = len(graph) visited = [False] * num_nodes min_heap = [(0, start, -1)] mst_cost = 0 mst_edges = [] while min_heap: weight, u, parent = heapq.heappop(min…

go1.18版本下 beego/bee安装无法生成exe问题已解决

转自: https://www.cnblogs.com/leijiangsheng/p/17392795.html 我原来的项目是教育学习APP使用gin框架,很多东西都是自己原来实现的。最近开发小程序,需要重新独立后台,又重新找了下go框架研究了下,beego确实是个好框架,至少项目能用到的都考虑进去了。 然后发现我本地装…

哈希碰撞

问:两个字符串hashcode相同equals一定相同吗?equals相同hashcode一定相同吗? 答:equals相同hashcode一定相同,hashcode因为哈希碰撞所以equals不一定相同。 Hash如何存数据hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。 如下图:这里的学号是个key,哈希表…

实景三维助力智慧水利建设

随着信息技术的快速发展,智慧水利作为智慧城市的重要组成部分,正受到越来越多的关注。实景三维技术,以其独特的优势,为智慧水利建设提供了强有力的支撑。本文将探讨实景三维技术如何助力智慧水利建设。一、智慧水利建设的背景智慧水利是指运用现代信息技术,对水利设施进行…

python第四章课后习题

点击查看代码 import numpy as np import cvxpy as cpx=cp.Variable(6,pos=True) obj=cp.Minimize(x[5]) a1=np.array([0.025, 0.015, 0.055, 0.026]) a2=np.array([0.05, 0.27, 0.19, 0.185, 0.185]) a3=np.array([1, 1.01, 1.02, 1.045, 1.065]) k=0.05; kk=[]; qq=[] while …

Go语言net/http包源码学习

0.前言 该笔记为笔者第一次学习go的net/http包源码的时候所记,也许写的并不是很精确,希望大家多多包涵,一起讨论学习。 该笔记很大程度的参考了网名为“小徐先生”的前辈所分享的博客,推荐大家可以先看一看它的博客来一起学习,我的只是照葫芦画瓢还有一些代码更新的讲解而…