如何在 ffmepg 中的 filter_complex 中按比例引用背景中视频的高度?

如何在 ffmepg 中的 filter_complex 中按比例引用背景中视频的高度?

我有一个分辨率为 480x360(即宽高比为 4:3)的视频。我知道如何通过将其插入到 16:9 彩色背景上来更改该视频的宽高比。以下是我正在做的一个最小工作示例:

以下命令生成分辨率为 480x360(即宽高比为 4:3)的示例视频

ffmpeg \
  -v error -y \
  -f lavfi \
  -i testsrc=size=480x360:d=10 \
  testsrc.mp4

在此处输入图片描述

以下命令使用之前生成的视频,对其进行缩放,并将其放在分辨率为 720x405 的视频之上(即宽高比:16:9)。

ffmpeg
  -v error -y \
  -f lavfi \
  -i color=c=yellow:s=720x405 \
  -i testsrc.mp4 \
  -filter_complex '[1:v]scale=-1:405 [ovrl],[0:v][ovrl]overlay=(main_w-overlay_w)/2:0:shortest=1' \
  output.mp4

在此处输入图片描述

如上所示,彩色背景的高度(即)与内部405使用的大小相同。我这样做是因为我希望重新缩放的视频能够完美地适应彩色背景视频的顶部,以便完全显示视频的内容。scale-filter_complex

我经常发现自己会改变彩色背景的高度,我希望有某种方式来scale引用filter_complex彩色背景的高度,这样我就不需要在两个地方更改高度。我知道我可以在各种编程语言中定义一个变量并ffmpeg从那里调用,如下面的代码块所示bash,但我不想这样做,原因有两个:(1) 我不想依赖其他工具来有效使用 ffmpeg,(2) 我想更多地了解 ffmpeg 的内部原理。

my_height=405

ffmpeg \
  -v error -y \
  -f lavfi \
  -i "color=c=yellow:s=720x$my_height" \
  -i testsrc.mp4 \
  -filter_complex "[1:v]scale=-1:$my_height [ovrl],[0:v][ovrl]overlay=(main_w-overlay_w)/2:0:shortest=1" \
  output.mp4

答案1

我们可能会使用scale2ref筛选:

ffmpeg \
  -y \
  -f lavfi \
  -i "color=c=yellow:s=720x405" \
  -i testsrc.mp4 \
  -filter_complex "[1:v][0:v]scale2ref=w=oh*mdar:h=ih[ovrl][v0];[v0][ovrl]overlay=(main_w-overlay_w)/2:0:shortest=1" \
  output.mp4

当使用 时scale2ref,我们可以访问main_h
示例使用mdar等于(main_w / main_h) * main_sar(main_sar = 1)。


输出:
在此处输入图片描述

相关内容