背景

很简单的需求:我需要将一个gif嵌入到视频里面的指定位置,并要指定时间播放;

环境

windows11 64位专业版

ffmpeg version 2022-04-07-git-607ecc27ed-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers

输入:input.mp4(6秒), 1.gif(1.24秒)

第一版:先将gif嵌入指定位置

ffmpeg -i input.mp4  -stream_loop -1 -i 1.gif -filter_complex "[0:v][1:v] overlay=10:10:shortest=1" output1.mp4 -y

参数释义:

  • -stream_loop -1:-1 表示 GIF 文件无限循环播放。也可以指定播放次数,如:2,播放两次;
  • -i 1.gif:设置 1.gif 作为第二个输入文件。
  • -filter_complex "[0:v][1:v] overlay=10:10:shortest=1":设置一个复杂滤镜。此滤镜将 GIF 文件(第二个输入,即 [1:v])叠加到视频文件(第一个输入,即 [0:v])上。叠加的位置在坐标 (10,10) 上。shortest=1 表示当任何一路输入结束时,输出也将结束。
  • output1.mp4 -y:将结果输出到 output1.mp4。如果文件已存在,-y 选项会直接覆盖它。

运行结果:没有问题,gif被嵌入到指定位置,并正常播放;

注意:shortest=1 参数如果没写,视频会无限渲染,最终搞嘎机器;

第二版:指定gif显示时间段

错误写法

我这里写的时候以为shortest参数跟shortest互斥的,这样写:

#错误写法
ffmpeg -i input.mp4 -stream_loop 1 -i 1.gif -filter_complex "[0:v][1:v] overlay=10:10:enable='between(t,3,4)'" output1.mp4 -y

参数释义:

-stream_loop 1: 这里指定了gif播放的次数(这里指定1次,实际播放两次,暂搞不明白,可能跟gif的循环次数设置有关);

enable='between(t,3,4)' 表示这个动画只有在视频的第3秒到第4秒之间才会显示。

运行结果: 发现gif位置正确,显示时间正确,就是不会动了,花了不少时间找原因;

最后排查到gif不动原因是:

1、gif是从视频一开始加载就播放的,并不是到(t,3,4)再播放,between控制的是显示时间;

2、这里指定播放次数1(但实际播放两次),耗时1.24*2=2.48s,也就是2.48秒后,gif就不动了,破案;

所以正确写法是

1、-stream_loop -1 :gif无限循环;

2、shortest=1:以视频流的播放结束作为输出结束条件;再用between控制显示时间即可;

ffmpeg -i input.mp4  -stream_loop -1 -i 1.gif -filter_complex "[0:v][1:v] overlay=10:10:enable='between(t,3,4)':shortest=1" output1.mp4 -y

运行结果:完美!收工

总结

有时候很简单的东西,不熟还是要踩坑;

参考

https://www.bannerbear.com/blog/how-to-overlay-an-animated-gif-on-a-video-using-ffmpeg/#overlaying-a-static-png

FFmpeg如何将一个gif嵌入视频指定位置并指定显示时间的更多相关文章

  1. (转载) popupWindow 指定位置上的显示

    popupWindow 指定位置上的显示 标签: androidpopupWindowpopupWindow具体位置放置 2014-07-09 16:23 1114人阅读 评论(0) 收藏 举报  分 ...

  2. java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处.  http://www.cnblogs.com/king-xg/p/6370890.html 如果觉得对您有 ...

  3. sql中从指定位置截取指定长度字符串

    1. 字符串函数应用 --从指定索引截取指定长度的字符串 ,) --获取字符串中指定字符的索引(从1开始) select charindex(',','ab,cdefg') --实际应用中的语句 , ...

  4. android学习——popupWindow 在指定位置上的显示

    先看效果图,免得浪费大家时间,看是不是想要的效果 . 直接上代码 ,核心方法. [java] view plaincopy private void showPopupWindow(View pare ...

  5. popupWindow 在指定位置上的显示

    先看效果图,免得浪费大家时间,看是不是想要的效果 . 直接上代码 ,核心方法. private void showPopupWindow(View parent) { if (popupWindow  ...

  6. java如何实现替换指定位置的指定字符串的功能

    /**  * @创建日期 2013-07-15  * @创建时间 14:25:59  * @版本号 V 1.0  */ public class CosTest {     public static ...

  7. Java分享笔记:RandomAccessFile流 & 在文件指定位置插入内容

    RandomAccessFile流:随机存取文件流,该类定义了一个记录指针,通过移动指针可以访问文件的任意位置,且对文件既可以读也可以写.使用该类的write方法对文件写入时,实际上是一种覆盖效果,即 ...

  8. python 批量修改预定字符串并将修改后的字符串插入文件指定位置

    下面的例子是在文件的指定位置增加指定字符串的例子 修改配置文件: def add_str(pre_str): lines = [] flag = True f = open("z.txt&q ...

  9. 【C语言】编写函数,将一个数的指定位置置0或置1

    //编写函数,将一个数的指定位置置0或置1 #include <stdio.h> unsigned int set_bit(unsigned int num, int pos, int f ...

  10. FFmpeg 入门(1):截取视频帧

    本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上如果要运行教程中的相关代码需要先安装 FFmpeg,建议使用 brew 来安装: // ...

随机推荐

  1. dotnet 使用 CsWin32 库简化 Win32 函数调用逻辑

    很多开发者,包括开发老司机们,在碰到需要调用 Win32 函数时,都有一个困扰,那就是我应该如何去调用.有两个主要的选项,第一就是自己写 PInvoke 代码,第二就是使用其他大佬给许多 Win32 ...

  2. 特权同学笔记-《边练边学》-在QP里调用modelsim的步骤

    在QP里调用Modelsim需要先设置仿真参数和工具路径. 在QP调用modelsim的步骤 1. 在QP里建立工程,代码,分析综合:2. 添加testbench代码,processing-start ...

  3. 使用 @NoRepositoryBean 简化数据库访问

    在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错.开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余.幸运的是,Spri ...

  4. Java中HTTP下载文件——并解决跨域

    1.常用的需要设置的MIME类型 任何文件(二进制文件) application/octet-stream .doc application/msword .dot application/mswor ...

  5. 使用 Docker 部署 moments 微信朋友圈

    1)项目介绍 GitHub:https://github.com/kingwrcy/moments 今天给大家分享一个 类似微信朋友圈 的项目 moments,适合用于记录生活. 2)项目特色 支持匿 ...

  6. golang基础之结构体

    匿名结构体 在定义一些临时数据结构等场景下还可以使用匿名结构体. 在函数体内 package main import ( "fmt" ) func main() { //方法一 v ...

  7. MySQL:根据指定日期加365天,当前时间距离明年的指定的日期还有多少天-SQL

    一.数据准备 /* Navicat Premium Data Transfer Source Server : songweipeng Source Server Type : MySQL Sourc ...

  8. PHP实现没有数据库提交form表单到后台并且显示出数据列表(Vuejs和Element-UI前端设计表单)

    1.情境:如果你新建了个网站,却没有数据库服务器,如何把你的表单信息,提交到服务端后台,收集数据. 2.思路:如果用传统的form action 提交到一个form.php页面,此时只能存储一次数据, ...

  9. html布局浅谈

    现在布局方式主要分为三种 传统css布局方案(position,float,line-height等配合).实现复杂,需要多种属性配合使用,兼容性最好. flex布局方案.弹性布局,实现方便,兼容性较 ...

  10. C语言:窗口控制台颜色改变(不断换色)

    了解了stdlib头文件中的system 函数之后突发奇想想要做一个蹦迪效果后台 代码如下: #include <stdio.h> #include <stdlib.h> #i ...