ffmpeg - FFmpeg 的 GIF 叠加层闪烁
问题描述
在过去的几个月里,我一直在使用 ffmpeg,并且无法摆脱在添加 GIF 文件作为覆盖时遇到的问题。
基本上我想要实现的是在 MP4 视频的顶部添加一个透明的 GIF 动画作为覆盖。
请在下面找到我正在使用的示例命令:
ffmpeg \
-i 0689a8a9-43b5-45d2-b0e8-acbea6905ce1.mp4 \
-ignore_loop 0 \
-i 02a6e696-969b-4a90-9444-e4b0b4d6f6da.gif \
-t 10.000000 \
-filter_complex "[0:v][1:v]overlay=enable='between(t, 1, 3)'[overlay]" \
-map '[overlay]' \
-pix_fmt yuv420p \
output.mp4
为了更好地理解,请注意:
-ignore_loop 0
只要启用了叠加层,我就可以循环播放动画-t
让我的视频持续 10 秒overlay=enable='between(t, 1.0, 3.0)'
设置可见的时间间隔
但是,当我运行此命令时,在 GIF 消失前几毫秒(3 秒),它开始闪烁。如果我逐帧查看它,它实际上会从视频中消失,然后又回来,最终如预期般消失。
请在此链接中找到一个黑色背景和来自 giphy 的随机 GIF 的示例。资产可以在这里找到。
我可能在这里遗漏了一些东西。你有什么提示吗?
我跑ffmpeg
进去了4.3.1
。
先感谢您
解决方案
我可以用任意 gif 复制它。我怀疑覆盖过滤器中存在错误。随时将其提交给https://trac.ffmpeg.org。
一旦设置了时间过滤(过滤器被列为具有时间线支持),就会发生这种情况,并且还会根据时间边界发生变化。后者永远不应该是这样。
MWE
ffmpeg \
-t 10 -s qcif -f rawvideo -pix_fmt rgb24 -r 25 -i /dev/zero \
-ignore_loop 0 -i 'https://media.tenor.com/images/c50ca435dffdb837914e7cb32c1e7edf/tenor.gif' \
-filter_complex "overlay=enable='between(t,3,7)'" \
-f flv - | ffplay -
作为一种解决方法,您可以尝试将 gif 转换为 mp4 ( ffmpeg -re -i <gif> [...]
) 并将白色区域设置为透明。
推荐阅读
- javascript - 我应该在显示之前过滤后端数据还是只选择字段并将数据保存在内存中?
- java - 如何创建一个可以将 keycloak 事件日志推送到 s3 的事件监听器?
- c# - 无法从程序集 Microsoft.AspNetCore.Routing Ver=3.1.7.0 加载类型 Microsoft.AspNetCore.Internal.EndpointRoutingApplicationBuilderExtensions
- laravel - 如何从 Laravel 中的嵌套关系中获取所有记录
- variables - 将两组变量关联为SPSS中的两个变量
- angular - Ngselect 中的项目未定义,我错过了什么?
- autofac - 如何指定 autofac 模块需要的外部依赖项
- c# - 通过 System.Reflection 获取类型:尝试强制转换时出错
- kubernetes - 在 Kubernetes 的 pod 中为单个容器使用非持久卷
- javascript - 无法使用 addEventListner 添加“活动”类