使用FFmpeg无重叠合并16:9视频并维持比例,主视频占80%以上、副视频置于右下角的方法
使用FFmpeg无重叠合并16:9视频并维持比例,主视频占80%以上、副视频置于右下角的方法
嘿,这个需求用FFmpeg完全可以搞定!核心思路是创建一个16:9的画布,把主视频缩放后占据大部分区域(80%以上),再把副视频缩放到合适尺寸放在右下角,两者完全不重叠,最终输出保持16:9比例。
我给你两种实现方式,一种是固定分辨率(适合已知原视频尺寸的情况),另一种是自适应比例(通用所有16:9视频):
一、固定分辨率实现(以1920×1080为例)
如果你的原视频是1920×1080的16:9格式,直接用这个命令:
ffmpeg -i main.mp4 -i sub.mp4 -filter_complex " # 创建1920×1080的黑色画布,帧率和主视频一致 color=c=black:s=1920x1080:r=30[base]; # 主视频缩放到1920×864(占画布高度的80%,保持16:9) [0:v]scale=1920:-1,scale=1920:864[main_scaled]; # 副视频缩放到384×216(画布宽度的20%,保持16:9) [1:v]scale=384:-1[sub_scaled]; # 把主视频放在画布顶部 [base][main_scaled]overlay=0:0[tmp]; # 把副视频放在画布右下角(W是画布宽度,w是副视频宽度;H是画布高度,h是副视频高度) [tmp][sub_scaled]overlay=W-w:H-h[out] " -map "[out]" -map 0:a? -c:v libx264 -crf 23 -preset medium output.mp4
二、自适应比例实现(通用所有16:9视频)
如果你的原视频不是1920×1080,用这个自适应命令,会自动匹配主视频的分辨率:
ffmpeg -i main.mp4 -i sub.mp4 -filter_complex " # 先获取主视频的原始分辨率,创建对应尺寸的黑色画布 [0:v]scale=iw:ih[main_original]; color=c=black:s=iw:ih:r=30[base]; # 主视频缩放到画布高度的80%,宽度自动保持16:9(如果要占满宽度,把scale改成iw:ih*0.8) [main_original]scale=-1:ih*0.8[main_scaled]; # 副视频缩放到画布宽度的20%,高度自动保持16:9 [1:v]scale=iw*0.2:-1[sub_scaled]; # 主视频居中放置(如果要顶格放,把overlay参数改成0:0) [base][main_scaled]overlay=(W-w)/2:0[tmp]; # 副视频固定放在右下角 [tmp][sub_scaled]overlay=W-w:H-h[out] " -map "[out]" -map 0:a? -c:v libx264 -crf 23 -preset medium output.mp4
额外注意事项
- 音频处理:上面的命令默认保留主视频的音频,如果需要把副视频的音频也混音进去,可以修改滤镜链,添加音频处理部分:
ffmpeg -i main.mp4 -i sub.mp4 -filter_complex " # 视频部分和之前一致 color=c=black:s=1920x1080:r=30[base]; [0:v]scale=1920:-1,scale=1920:864[main_scaled]; [1:v]scale=384:-1[sub_scaled]; [base][main_scaled]overlay=0:0[tmp]; [tmp][sub_scaled]overlay=W-w:H-h[out]; # 音频混音,取较短的视频时长作为输出时长 [0:a][1:a]amix=inputs=2:duration=shortest[aout] " -map "[out]" -map "[aout]" -c:v libx264 -crf 23 -preset medium output.mp4 - 时长匹配:如果副视频比主视频长,想要输出时长和主视频一致,只需在最后一个
overlay滤镜后加上:shortest=1,比如:overlay=W-w:H-h:shortest=1[out] - 参数调整:如果觉得主视频占比不够,可以把主视频的高度比例
0.8改成0.85或更高,对应的副视频宽度比例改成0.15,只要两者的区域不重叠且整体保持16:9即可。 - 编码参数:
-c:v libx264是FFmpeg常用的H.264编码,*-crf 23是推荐的质量参数(数值0-51,越小质量越高、文件越大),-preset medium*平衡了编码速度和压缩率,你可以换成fast加快速度,或slow获得更小的文件。
备注:内容来源于stack exchange,提问作者Petr Glaser
相关产品推荐
相关产品推荐

