ffmpeg 视频叠加启用 between/gte 仅适用于时间而不适用于帧

ffmpeg 视频叠加启用 between/gte 仅适用于时间而不适用于帧

我想在特定时间(两个时间之间或一个时间之后)将一个视频叠加在另一个视频之上。我之前曾使用 enable='between(t,2,4)'(或 gte)等方式执行此操作,但当我需要在它后面直接放置另一个叠加层时,有时它们之间会有一帧的间隙。因此,我决定改用 enable='between(n,60,120)' 指定帧,这种方法对其他类型的叠加层很有效,但不适用于视频。当叠加层出现在主视频的开头时,它可以正常工作,但是当叠加层稍后开始时,什么都没有出现。以下命令运行正常,叠加视频在 5.779 秒内出现并一直持续到结束。

/opt/ffmpeg -loglevel error -y \
-ss 3.56 -t 7.860 -i "main_video.mp4" \
-ss 1.5 -i "overlay_video.mp4" \
-i "overlay_image.png" \
-filter_complex "\
[0:v:0] setpts=PTS-STARTPTS [0_p]; \
[1:v:0] setpts=PTS-STARTPTS+5.779/TB [1_p]; \
[0_p] [1_p] overlay=y=0:x=0:enable='gte(t,5.779)':shortest=1 [0_p_o]; \
[0_p_o] [2:0] overlay=y=0:x=0 [0_p_o_o]; \
[0_p_o_o] drawbox=x=38:y=460:w=492:h=116:t=fill:color=#[email protected]:enable='between(n,0,173)' 
[0_p_o_o_b]" \
-framerate 29.97 -c:v libx264 -crf 23 -pix_fmt yuv420p -vsync 2 \
-video_track_timescale 90000 \
-map "[0_p_o_o_b]" -t 7.860 "output.mp4"

但是这个命令不起作用,唯一的变化是 enable='gte(n,173)' 而不是 enable='gte(t,5.779)'

/opt/ffmpeg -loglevel error -y \
-ss 3.56 -t 7.860 -i "main_video.mp4" \
-ss 1.5 -i "overlay_video.mp4" \
-i "overlay_image.png" \
-filter_complex "\
[0:v:0] setpts=PTS-STARTPTS [0_p]; \
[1:v:0] setpts=PTS-STARTPTS+5.779/TB [1_p]; \
[0_p] [1_p] overlay=y=0:x=0:enable='gte(n,173)':shortest=1 [0_p_o]; \
[0_p_o] [2:0] overlay=y=0:x=0 [0_p_o_o]; \
[0_p_o_o] drawbox=x=38:y=460:w=492:h=116:t=fill:color=#[email protected]:enable='between(n,0,173)' 
[0_p_o_o_b]" \
-framerate 29.97 -c:v libx264 -crf 23 -pix_fmt yuv420p -vsync 2 \
-video_track_timescale 90000 \
-map "[0_p_o_o_b]" -t 7.860 "output.mp4"

我的猜测是它与 PTS 有关,并且我尝试在覆盖视频上调整设置点,但我能够实现的最好结果是在覆盖视频出现在屏幕上的持续时间内显示其最后一帧,或者在 5.779 秒时闪烁一帧,仅此而已。

这可能是 Ffmpeg 的一个错误吗?或者我需要做其他什么才能让覆盖滤镜在指定帧而不是时间时工作?具有不同时间尺度的视频会影响事情吗?

相关内容