FFmpeg叠加图片出现黑块:添加fade-in失效问题求助
问题原因
你遇到的黑块问题,核心是单帧图片的时间轴与主视频不匹配。图片作为输入是单帧媒体,自身时间轴仅包含极短的1帧时长,当你给它添加fade=t=in:st=2.6:d=1滤镜时,这个滤镜是基于图片自身的时间轴计算的——但图片在自身时间轴的2.6秒处早已没有有效帧,滤镜处理后输出的就是黑帧,叠加后自然显示黑块。
解决方案
有两种简单的修复方式,推荐第二种更简洁的方案:
方案1:先扩展图片时长再添加淡入
先通过loop+tpad将图片拉伸到覆盖你需要的叠加时长,再应用fade滤镜,让图片的时间轴与主视频对齐:
-y -i "G:\...\Videos\BLANK.mp4" -i "G:\...\Front\1.jpg" -i "G:\...\Front\2.jpg" -i "G:\...\Front\3.jpg" -i "G:\...\Front\4.jpg" -i "G:\...\Front\5.jpg" -i "G:\...\Front\6.jpg" -filter_complex [1:v]scale=880:545:force_original_aspect_ratio=decrease,loop=loop=-1:size=1,setpts=N/FRAME_RATE/TB,tpad=stop_mode=clone:stop_duration=4,fade=t=in:st=2.6:d=1[img0]; [0:v][img0]overlay=x='if(lte(2.6-t,0),450,NAN)':y='if(lte(2.6-t,0),5,NAN)':enable='between(t,2.6,4)'[v0]; [2:v]scale=880:545:force_original_aspect_ratio=decrease[img1]; [v0][img1]overlay=x='if(lte(4-t,0),450,NAN)':y='if(lte(4-t,0),5,NAN)':enable='between(t,4,5.6)'[v1]; [3:v]scale=880:545:force_original_aspect_ratio=decrease[img2]; [v1][img2]overlay=x='if(lte(5.6-t,0),450,NAN)':y='if(lte(5.6-t,0),5,NAN)':enable='between(t,5.6,6.3)'[v2]; [4:v]scale=880:545:force_original_aspect_ratio=decrease[img3]; [v2][img3]overlay=x='if(lte(6.3-t,0),450,NAN)':y='if(lte(6.3-t,0),5,NAN)':enable='between(t,6.3,6.9)'[v3]; [5:v]scale=880:545:force_original_aspect_ratio=decrease[img4]; [v3][img4]overlay=x='if(lte(6.9-t,0),450,NAN)':y='if(lte(6.9-t,0),5,NAN)':enable='between(t,6.9,7.4)'[v4]; [6:v]scale=880:545:force_original_aspect_ratio=decrease[img5]; [v4][img5]overlay=x='if(lte(7.4-t,0),450,NAN)':y='if(lte(7.4-t,0),5,NAN)':enable='between(t,7.4,7.9)'[v5]; -map [v5] -map 0:a -c:v libx264 -c:a copy "G:\...\Videos\ffmpeg\output.mp4"
loop=loop=-1:size=1:让单帧图片无限循环setpts=N/FRAME_RATE/TB:修正时间戳,让循环的图片流时间轴与主视频同步tpad=stop_mode=clone:stop_duration=4:将图片流时长固定为4秒(覆盖到第一个overlay的结束时间)
方案2:在overlay滤镜中直接实现淡入(推荐)
不需要给图片单独加fade滤镜,直接在overlay的alpha参数中用表达式实现淡入逻辑,完全避开时间轴不匹配的问题:
-y -i "G:\...\Videos\BLANK.mp4" -i "G:\...\Front\1.jpg" -i "G:\...\Front\2.jpg" -i "G:\...\Front\3.jpg" -i "G:\...\Front\4.jpg" -i "G:\...\Front\5.jpg" -i "G:\...\Front\6.jpg" -filter_complex [1:v]scale=880:545:force_original_aspect_ratio=decrease[img0]; [0:v][img0]overlay=x='if(lte(2.6-t,0),450,NAN)':y='if(lte(2.6-t,0),5,NAN)':enable='between(t,2.6,4)':alpha='if(lt(t,2.6),0,min(1,(t-2.6)/1))'[v0]; [2:v]scale=880:545:force_original_aspect_ratio=decrease[img1]; [v0][img1]overlay=x='if(lte(4-t,0),450,NAN)':y='if(lte(4-t,0),5,NAN)':enable='between(t,4,5.6)'[v1]; [3:v]scale=880:545:force_original_aspect_ratio=decrease[img2]; [v1][img2]overlay=x='if(lte(5.6-t,0),450,NAN)':y='if(lte(5.6-t,0),5,NAN)':enable='between(t,5.6,6.3)'[v2]; [4:v]scale=880:545:force_original_aspect_ratio=decrease[img3]; [v2][img3]overlay=x='if(lte(6.3-t,0),450,NAN)':y='if(lte(6.3-t,0),5,NAN)':enable='between(t,6.3,6.9)'[v3]; [5:v]scale=880:545:force_original_aspect_ratio=decrease[img4]; [v3][img4]overlay=x='if(lte(6.9-t,0),450,NAN)':y='if(lte(6.9-t,0),5,NAN)':enable='between(t,6.9,7.4)'[v4]; [6:v]scale=880:545:force_original_aspect_ratio=decrease[img5]; [v4][img5]overlay=x='if(lte(7.4-t,0),450,NAN)':y='if(lte(7.4-t,0),5,NAN)':enable='between(t,7.4,7.9)'[v5]; -map [v5] -map 0:a -c:v libx264 -c:a copy "G:\...\Videos\ffmpeg\output.mp4"
alpha='if(lt(t,2.6),0,min(1,(t-2.6)/1))':- 当主视频时间
t<2.6时,图片完全透明(alpha=0) - 当
t在2.6到3.6秒之间时,alpha从0线性增加到1,实现1秒的淡入效果 - 3.6秒之后到4秒结束,alpha保持1(完全不透明)
- 当主视频时间
内容的提问来源于stack exchange,提问作者robert
相关产品推荐
相关产品推荐

