我正在使用 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
- 您可以通过以下方式获取尺寸:
ffprobe -v 错误 -show_entries 流 = 宽度,高度 -of 默认 = noprint_wrappers = 1 -of json input_video
- 将输出存储在变量中,例如 ffprobe_output。然后获取宽度:
宽度 = ffprobe_output['流'][0]['宽度']
对于 m4v 文件,必须在第二个数组中获取它们:
宽度 = ffprobe_output['流'][1]['宽度']
- 按该宽度缩放:
3.a) 按给定宽度缩放并保持纵横比
ffmpeg -i 输入影片 -vf scale=宽度:-1 输出影片
3.b) 按给定的宽度缩放,保持纵横比,但使高度可以被 2 整除(许多像素格式要求):
ffmpeg -i 输入影片 -vf scale=宽度:-2 输出影片