如何使用ffmpeg获取视频的宽度并将另一个视频缩放到该宽度?

Les*_*ger 4 video ffmpeg

我正在使用 ffmpeg 垂直堆叠两个视频。它们的大小可能不同,所以我需要将它们缩放到相同的大小。我找到了以下命令。

第一个适用于不同的尺寸(但不会缩放到合适的尺寸):

ffmpeg -i input1 -i input2 -filter_complex '[0:v]pad=iw:ih*2[int];[int][1:v]overlay=0:H/2[vid]' -map [vid] -c:v libx264 -crf 23 -preset veryfast output
Run Code Online (Sandbox Code Playgroud)

如果视频具有相同的宽度和相同的像素格式,则第二个有效:

ffmpeg -i input1 -i input2 -filter_complex vstack output
Run Code Online (Sandbox Code Playgroud)

如何在复杂过滤器参数中获取第一个输入的宽度,以便第二个输入可以缩放到相同的宽度?这样做的命令是什么?我更喜欢 vstack 过滤器,因为它应该比 pad 和 overlay 的组合更快。

Gya*_*yan 10

您需要使用scale2ref过滤器。

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在两个视频的纵横比相同时才有效。如果没有,并且您知道第二个视频的纵横比,请使用[1][0]scale2ref=iw:iw*(H/W)[2nd][ref]where (H/W) 应替换为第二个视频的高宽比。


通过构建 ffmpeg 的最新 git 版本,可以使用简化版本,

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref=oh*mdar:ih[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output
Run Code Online (Sandbox Code Playgroud)

这将自动保留第二个输入的纵横比。