使用 FFMPEG 向视频内视觉进度条添加背景?

Adding a background to an in-video visual progress bar with FFMPEG?

使用
的答案

我想给进度条本身一个背景,例如进度条会变成白色,随着时间的推移会被红色进度条覆盖。

我的第一个决定是应用抽屉式滤镜,因此出于我的目的,视频的宽度为 1280 像素,持续时间为 6.027 秒。我试过了

ffmpeg -i uuid_nordvpn.mp4 -vf "color=c=red:s=1280x30[bar];[0][bar]overlay=-w+(w/6.072733)*t:H-h:shortest=1, drawbox=x=0:y=720-30:width=1280:height=30:thickness=fill:color=white" out.mp4

但我得到的只是绘制在彩色滤镜上方的白色抽屉式滤镜。

显而易见的解决方案是交换颜色和绘图框过滤器,但是 returns 一个错误 Too many inputs specified for the "color" filter,我猜这意味着你只能在开始时使用颜色过滤器。

我也试过应用2个滤色器,另一个滤色器而不是填充正在下降,但是你不能应用2个滤色器,再次给出原因Too many inputs specified for the "color" filter.

此时我完全迷失了,我该如何为这个过滤器提供背景?

您可以使用多个 color 过滤器。但是 color 过滤器是一个源过滤器,所以它不能出现在你的过滤器链的中间(这就是错误消息所说的)。它必须是链中的第一个过滤器。这应该适合你:

编辑:您使用 overlay 滑动的方法比我原来的 scale 方法更快。我已经以观察到的速度添加了所有 4 个实现:

1. 2xcolor+2xoverlay: x14.1

ffmpeg -i uuid_nordvpn.mp4 \
  -vf 'color=c=white:s=1280x30[L0]; \
       color=c=red:s=1280x30[L1]; \
       [L0][L1]overlay=(t/6.072733-1)*w:0:eval=frame[L2]; \
       [in][L2]overlay=0:690:shortest=1[out]' \
  out.mp4

2。 drawbox + color + overlay: 13.4x

ffmpeg -i uuid_nordvpn.mp4 \
  -vf '[in]drawbox=0:690:1280:30:white:fill[L0]; \
       color=c=red:s=1280x30[L1]; \
       [L0][L1]overlay=(t/6.072733-1)*w:690:eval=frame:shortest=1[out]' \
  out.mp4

3。 2xcolor+scale+2xoverlay: 5.09x

ffmpeg -i uuid_nordvpn.mp4 \
  -vf 'color=c=white:s=1280x30[L0]; \
       color=c=red:s=1280x30,scale=max(t/6.072733*in_w\,1):in_h:eval=frame[L1]; \
       [L0][L1]overlay=0:0[L2]; \
       [in][L2]overlay=0:690:shortest=1[out]' \
  out.mp4

4。 drawbox + color + scale + overlay: 5.03x

ffmpeg -i uuid_nordvpn.mp4 \
  -vf '[in]drawbox=0:690:1280:30:white:fill[L0]; \
       color=c=red:s=1280x30,scale=max(t/6.072733*in_w\,1):in_h:eval=frame[L1]; \
       [L0][L1]overlay=0:690:shortest=1[out]' \
  out.mp4