背景

很简单的需求:我需要将一个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. WPF 通过 EXIF 设置和读取图片的旋转信息

    本文将告诉大家如何在 WPF 里面设置图片的 EXIF 信息,包括如何设置图片的旋转信息,以及如何读取 EXIF 的内容 值得一提的是在 WPF 里面,默认的图片渲染信息是无视 System.Phot ...

  2. K8s集群中部署SpringCloud在线购物平台(二)

    三.harbor简介 harbor 是私有镜像仓库,用来存储和分发镜像的 docker 还有一个官方的镜像仓库 docker hub,免费用户只能简单的使用,创建一个私有镜像仓库,存储 镜像,付费用户 ...

  3. go和c#实现斐波那契数列

    首先通过C#实现斐波那契数列: using System.Threading.Channels; namespace App001 { internal class Program { static ...

  4. 云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理

    01 方案概述 现在绝大多数客户都有很多非结构化的数据存在 OSS 中,以图片,视频,音频居多.举一个图片处理的场景,现在各种终端种类繁多,不同的终端对图片的格式.分辨率要求也不同,所以一张图片往往会 ...

  5. WEB服务与NGINX(11)-NGINX状态页

    nginx状态页 nginx的状态页功能用于输出nginx的基本状态信息,基于ngx_http_stub_status_module模块实现. 默认情况下不生成此模块,应使用--with-http_s ...

  6. 如何获取Github Token

    登录我们的github账号,点击头像后选择Settings 进入界面之后下拉到左侧菜单的最后,选择Developer settings 进入界面后,选择Personal access tokens-- ...

  7. Java面试题:@PostConstruct、init-method和afterPropertiesSet执行顺序?

    在Spring框架中,@PostConstruct注解.init-method属性.以及afterPropertiesSet()方法通常用于初始化Bean的逻辑.它们都提供了在Bean创建和初始化完成 ...

  8. 一文读懂Apollo客户端配置加载流程

    SpringBoot集成Apollo源码分析 本文基于 apollo-client 2.1.0 版本源码进行分析 Apollo 是携程开源的配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修 ...

  9. Android 12(S) MultiMedia(十一)从MPEG2TSExtractor到MPEG2-TS

    本节主要学习内容是看看MPEG2TSExtractor是如何处理TS流的. 相关代码位置: frameworks/av/media/extractors/mpeg2/MPEG2TSExtractor. ...

  10. block专递参数导致野指针引发crash

    一.问题引入 近日开发中引入一个随机crash,Crash堆栈如下: Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x0000000 ...