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

如何获取视频的宽度并使用 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

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

ffmpeg -i input1 -i input2 -filter_complex vstack output

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

答案1

您需要使用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

请注意,只有当两个视频的宽高比相同时,此方法才有效。如果不同,并且您知道第二个视频的宽高比,[1][0]scale2ref=iw:iw*(H/W)[2nd][ref]则使用 (H/W) 替换为第二个视频的高度与宽度之比。


使用最新的 git 版本的 ffmpeg,可以实现一个简化版本,

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

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

答案2

  1. 您可以通过以下方式获取尺寸:

ffprobe -v 错误 -show_entries 流 = 宽度,高度 -of 默认 = noprint_wrappers = 1 -of json input_video

  1. 将输出存储在变量中,例如 ffprobe_output。然后获取宽度:

宽度 = ffprobe_output['流'][0]['宽度']

对于 m4v 文件,必须在第二个数组中获取它们:

宽度 = ffprobe_output['流'][1]['宽度']

  1. 按该宽度缩放:

3.a) 按给定宽度缩放并保持纵横比

ffmpeg -i 输入影片 -vf scale=宽度:-1 输出影片

3.b) 按给定的宽度缩放,保持纵横比,但使高度可以被 2 整除(许多像素格式要求):

ffmpeg -i 输入影片 -vf scale=宽度:-2 输出影片

相关内容