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:v][1:v]overlay=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:v]setpts=PTS-STARTPTS+1/TB[delayedGif];

0:v\]\[delayedGif\]overlay=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) ```

相关推荐
herb.dr15 小时前
FFMPEG H264
ffmpeg
AJi18 小时前
编解码原理(一):H264
ffmpeg·音视频开发·视频编码
linux开发之路1 天前
C++ 音视频开发常见面试题及答案汇总
c++·ffmpeg·音视频·流媒体·音视频编解码
默凉3 天前
ffmpeg 安装
ffmpeg
微瑟秋风5 天前
Python应用——ffmpeg处理音视频的常见场景
python·ffmpeg
WSSWWWSSW5 天前
警告:OPENCV_FFMPEG_READ_ATTEMPTS (current value is 4096)
人工智能·opencv·ffmpeg
A尘埃5 天前
FFmpeg音视频处理解决方案
ffmpeg·音视频
Industio_触觉智能5 天前
瑞芯微RK3576平台FFmpeg硬件编解码移植及性能测试实战攻略
ffmpeg·开发板·嵌入式开发·瑞芯微·视频解码·rk3576·rk3576j
Font Tian6 天前
FFmpeg 不同编码的压缩命令详解
ffmpeg·音视频·视频编解码·视频·视频压缩
Natsume17106 天前
音视频开发入门:FFmpeg vs GStreamer,新手该如何选择?
c语言·c++·ffmpeg·音视频·webrtc·实时音视频·视频编解码