我有一个分辨率为 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)。