FFmpeg技术问询:指定时段对视频特定区域无淡入淡出缩放的实现方案
FFmpeg技术问询:指定时段对视频特定区域无淡入淡出缩放的实现方案
嘿,这个需求用FFmpeg完全能搞定!你要的是在指定时间段内,对视频某个特定区域做无淡入淡出的缩放,且缩放后的画面直接叠加在原视频上对吧?我直接给你核心实现命令,再把每个参数对应到你需要的输入项,你照着改就行。
核心命令模板
-i input.mp4 \ -filter_complex "[0:v]crop=w=区域宽度:h=区域高度:x=中心点X-区域宽度/2:y=中心点Y-区域高度/2,scale=w=区域宽度*缩放级别:h=区域高度*缩放级别[zoomed_layer]; \ [0:v][zoomed_layer]overlay=x=(原视频宽度/2 - (区域宽度*缩放级别)/2):y=(原视频高度/2 - (区域高度*缩放级别)/2):enable='between(t,开始时间,结束时间)'" \ -c:a copy output.mp4
参数对应说明(直接替换成你的需求值就行)
开始时间:你要启动缩放的时间点(单位:秒),比如第5秒就写5结束时间:缩放停止的时间点(单位:秒),如果是给时长的话,就用开始时间+时长,比如开始于第3秒、持续4秒,就写7中心点X/Y:你指定的缩放区域的中心坐标(相对于原视频的像素坐标)区域宽度/区域高度:你要缩放的原视频区域的尺寸(比如想放大一个640x360的区域,就填对应数值)缩放级别:放大倍数,比如要放大2倍就写2原视频宽度/原视频高度:你可以先用ffmpeg -i input.mp4查看原视频分辨率,或者更智能的用FFmpeg内置变量iw(原视频宽度)和ih(原视频高度)替换,这样不用手动查分辨率
举个实际例子
假设你的原视频是1920x1080,需求是:
- 从第3秒开始,持续4秒(到第7秒)
- 中心点在画面正中心(960,540)
- 要缩放的区域是640x360
- 缩放级别是2倍
对应的命令就是:
-i input.mp4 \ -filter_complex "[0:v]crop=w=640:h=360:x=960-320:y=540-180,scale=w=640*2:h=360*2[zoomed_layer]; \ [0:v][zoomed_layer]overlay=x=(iw/2 - (640*2)/2):y=(ih/2 - (360*2)/2):enable='between(t,3,7)'" \ -c:a copy output.mp4
关键注意事项
- 这个方案完全没有淡入淡出效果,缩放层会在指定时间点直接显示、到点直接消失,符合你的要求
- 缩放后的画面是叠加在原视频上方的,原视频的其他区域保持原样
- 计算crop的
x和y时,一定要用中心点X - 区域宽度/2和中心点Y - 区域高度/2,这样才能保证crop的区域是以你指定的点为中心的 -c:a copy参数是直接复制原视频的音频,避免重新编码,能节省大量处理时间
备注:内容来源于stack exchange,提问作者Peter.k
相关产品推荐
相关产品推荐

