我有一张覆盖图像(将其视为容器图像,也可以将其拆分为 2 张图像),需要在里面放一个视频(在黑色区域中)。问题是我需要让它适用于不同的视频尺寸,它们都具有相同的宽高比(16:9 视频宽高比)这些是我的视频尺寸:
1280 x 720 ( aspect ratio is 16:9 )
1920 x 1080n ( aspect ratio is 16:9 )
2560 x 1440 ( aspect ratio is 16:9 )
我有一个包含这些视频的图像叠加层,我怎样才能首先根据输入视频的宽度动态调整此图像叠加层的大小,然后将视频放在其上?由于我有不同的视频尺寸,我无法说出要叠加在图像上的视频的正确位置,是否有任何技巧,例如使用百分比而不是像素?
顶部图像和底部图像的高度不一样:
答案1
这是我在测试中使用的代码,请查看它是否能得到预期的输出
使用两张图片:
在这个例子中,我将顶部和底部部分剪切成两个单独的图像:
ffmpeg -i Input.mp4 -i Top.jpg -i Bottom.jpg -filter_complex "[1][0]scale2ref=w=iw:h=ow/mdar[top][vid];[2][vid]scale2ref=w=iw:h=ow/mdar[bottom][vid];[top][vid][bottom]vstack=inputs=3[final];[final]scale=iw:-2[final]" -map [final] -map 0:a:0 -shortest -vsync 0 -c:v libx264 "Output.mp4"
最终的视频效果如下:测试.mp4
通过使用单个图像:
在这个例子中,我使用了主题创建者提供的图像。
考虑以下坐标:
理论上至少根据我的计算,这应该是完美工作的,但视频和底部之间仍然有一些黑条,但没有大的混乱......
ffmpeg -i input.mp4 -i img.jpg -filter_complex "[1][0]scale2ref=w=iw:h=ow/mdar[img][vid];[vid][img]scale2ref=h=ih*((533-(53+118))/533)[vid][img];[img][vid]overlay=x=0:y=H*((53)/533)[final];[final]scale=iw:-2[final]" -map 0:a:0 -map [final] -shortest -vsync 0 -c:v libx264 -c:a copy output.mp4
解释:
This part sets the image same width and proportional height as video width:
"[1][0]scale2ref=w=iw:h=ow/mdar[img][vid];
Sets the video height according to the black area:
[vid][img]scale2ref=h=ih*((533-(53+118))/533)[vid][img]
Positions the video as overlay under the top part of the image:
[img][vid]overlay=x=0:y=H*((53)/533)[final]
Scales the resulting video to force the height to be divisible by 2 cause mp4 videos return errors if the height is not divisible by 2...:
[final]scale=iw:-2[final]"