FFmpeg实现Snapchat式全屏图片覆叠(适配不同分辨率视频)
实现FFmpeg全屏覆叠图的Snapchat式黑边适配效果
我懂你想要的效果——让视频自动添加黑边来适配覆叠图的比例,而不是把覆叠图挤压变形。你当前的命令是把覆叠图缩放到视频的尺寸,这就导致了比例不匹配时的拉伸问题。下面是调整后的解决方案,完美实现你要的Snapchat风格效果:
修改后的FFmpeg命令
String[]{"-y", "-i", filePath, "-i", overlayPath, "-preset", "ultrafast", "-filter_complex", "[0][1]scale2ref=w='min(ow, ih*dar)':h='min(oh, iw/dar)':force_original_aspect_ratio=decrease[v_scaled][overlay];[v_scaled]pad=w=ow:h=oh:x=(ow-iw)/2:y=(oh-ih)/2[v_padded];[v_padded][overlay]overlay[v]", "-map", "[v]", "-map", "0:a?", "-ac", "2", output};
命令详解
咱们拆解一下每个部分的作用,让你明白为什么这么改:
[0][1]scale2ref=...:这一步是让视频(流0)参照覆叠图(流1)的尺寸进行缩放。min(ow, ih*dar)和min(oh, iw/dar)保证视频只缩小不放大,同时严格保持自身的原始比例,不会被拉伸。force_original_aspect_ratio=decrease进一步确保视频不会因为强制适配而变形。pad=w=ow:h=oh:...:缩放后的视频尺寸会比覆叠图小,这一步就给视频添加黑边,把整个画面填充到覆叠图的尺寸,而且视频会自动居中显示——如果视频比例比覆叠图宽,就左右加黑边;如果视频更窄,就上下加黑边,完全贴合Snapchat的效果。[v_padded][overlay]overlay[v]:最后把覆叠图直接覆盖到加了黑边的视频上,因为两者尺寸完全一致,覆叠图会全屏显示,而且保持自己的原始比例,再也不会变形了。
和原命令的区别
你原来的命令[1][0]scale2ref[i][m];[m][i]overlay[v]是把覆叠图缩放到视频的尺寸,相当于让覆叠图去适配视频,自然会比例失调。新命令反过来,让视频适配覆叠图的比例,通过黑边填补空隙,覆叠图保持原样,这才是你要的效果。
内容的提问来源于stack exchange,提问作者Tabassum Latif
相关产品推荐
相关产品推荐

