FFMPEG: Overlay a video on a video after x seconds

I'm currently working on a video editor and there is a feature where you can select a gif from Giphy and overlay it on top of your video after a header transition.

With FFmpeg you can manipulate, combine, add effects with filters. There is a filter called overlay - that we can use.

This did not work as I expected:

To apply a filter after a certain amount of time we'll use the option enable (this option allows for timeline editing).

The below script overlays the gif.mp4 on top of main_video.mp4 during the 1 - 3 seconds duration.

ffmpeg -i main_video.mp4 -i gif.mp4 -filter_complex

"0:v1:voverlay=enable='between(t,1,3)'out"

-map out complete.mp4

** 0:v --> first video (main_video.mp4)

** 1:v --> the second video (gif.mp4)

** out --> first and second video combined into one after the overlay.

Problem: gif.mp4 will start playing from the beginning so after 1 second has passed the gif video will be 1 second in already.

Solution:

Use the setpts filter to delay the overlay video (gif.mp4) start with x seconds.

ffmpeg -i main_video.mp4 -i gif.mp4 -filter_complex

"1:vsetpts=PTS-STARTPTS+1/TBdelayedGif;

0:vdelayedGifoverlay=enable='between(t,1,3)'out"

-map out complete.mp4

The setpts filter evaluates its expression and assigns the value as the timestamp for the current frame it is processing. For a detailed explanation check out this awesome post.

For setpts=PTS-STARTPTS+1/TB:

** +1 is the time in seconds we want to delay our offset

** TB is the timebase.

Too see the gif-overlay in action check out Glitterly - a web based video editor I've been working on.

python 复制代码
import ffmpeg  
  
# 输入文件  
main_video = 'main_video.mp4'  
gif_video = 'gif.mp4'  # 注意:这里假设gif.mp4是一个有效的视频文件,尽管其扩展名可能误导人认为是GIF图像  
output_video = 'complete.mp4'  
  
# 创建ffmpeg流  
# 加载两个输入文件  
stream_main = ffmpeg.input(main_video)  
stream_gif = ffmpeg.input(gif_video)  
  
# 应用filter_complex  
# 设置gif视频的时间戳,使其相对于自身起始点延迟  
# 注意:ffmpeg-python中不需要显式地指定流索引(如[1:v]),因为你可以直接通过ffmpeg.input()返回的流对象来引用  


delayed_gif = ffmpeg.filter_(stream_gif.video, 'setpts', 'PTS-STARTPTS+1/TB')  

  
# 将主视频和延迟后的gif视频进行叠加  
# 只在时间1秒到3秒之间启用overlay  

overlay_filter = ffmpeg.filter_([stream_main.video, delayed_gif], 'overlay',  
                                enable='between(t,1,3)',  
                                x='(main_w-overlay_w)/2',  # 可选:居中gif  
                                y='(main_h-overlay_h)/2')  # 可选:居中gif  
  
# 创建输出流,仅包含处理后的视频  
output_stream = ffmpeg.output(overlay_filter, output_video)  
  
# 运行ffmpeg命令  
ffmpeg.run(output_stream)
相关推荐
风哥2号3 天前
数据库教程FGMT02‑生产环境Linux+Oracle19c安装配置与项目实战
linux·数据库·ffmpeg
Bruce_Liuxiaowei3 天前
录屏片段无损合并:从 ffmpeg concat 原理到 Python 自动化脚本
python·ffmpeg·自动化
工具派5 天前
口播视频怎么自动剪掉冷场?视频静音删除的阈值实测
ffmpeg·音视频·视频
❀͜͡傀儡师5 天前
移动端 360° 商品展示方案:从 20MB 雪碧图到 800KB 丝滑视频
ffmpeg·webgl·sprite
2501_930472446 天前
深度复盘|数据库迁移实战(上):腾讯云助手解析慢查询日志,定位索引缺失与语法不兼容
数据库·阿里云·ffmpeg·云计算·腾讯云·aws
我就是DaLing呀!6 天前
flutter + ffmpeg_kit_extended_flutter 大视频合并下载
flutter·ffmpeg·音视频
可乐鸡翅yeah_7 天前
多浏览器 HLS 兼容性差异排查,Chrome、Firefox、Safari 表现不一致定位
chrome·ffmpeg·音视频·firefox·safari·m3u8
行者-全栈开发8 天前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
可乐鸡翅yeah_9 天前
M3U8测试流使用指南,流媒体开发自测与环境校验标准化方案
网络·ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放
heqingchun169 天前
Ubuntu 22.04 交叉编译 RK3568 MPP + FFmpeg 完整指南
linux·ubuntu·ffmpeg