我需要垂直滚动图像,从图像的顶部滚动到底部,然后停止创建输出视频,直到图像的最后一个底部位于屏幕顶部时停止。
要一条命令完成此操作,请使用
ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -t 0.08 -i "input.png" -filter_complex "[1:v]scale=1920:-2,setpts=if(eq(N,0),0,1+1/0.02/TB),fps=25[fg]; [0:v][fg]overlay=y=-'t*h*0.02':eof_action=endall[v]" -map "[v]" output.mp4
请注意,在某些Shell(例如Bash)中,需要转义逗号:
ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -t 0.08 -i "input.png" -filter_complex "[1:v]scale=1920:-2,setpts=if(eq(N\,0)\,0\,1+1/0.02/TB),fps=25[fg]; [0:v][fg]overlay=y=-'t*h*0.02':eof_action=endall[v]" -map "[v]" output.mp4
添加-t
是为了使图像具有2帧流。 (25 fps x 0.08 = 2
)。 setpts将第二个帧的时间戳设置为滚动速率的倒数,该速率表示高度的分数。 fps过滤器使用克隆帧填充时间戳间隙。
覆盖叠加功能会在图像输入结束时停止。
if(eq(N,0),0,1+1/0.02/TB)
--> if(eq(N\,0)\,0\,1+1/0.02/TB)
。 - Gyansetpts=if(eq(N\,0)\,0\,PTS+2/TB)
。 - Gyan我找到了一个解决方案:
最初的回答:
ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -i "input.png" -filter_complex "[1:v]scale=1920:-2[fg]; [0:v][fg]overlay=y=-'t*h*0.02'[v]" -map "[v]" -t 00:03:00 output.mp4
file input.png | sed 's|.*1920 x \([0-9]\+\).*|\1|'
output: 7043
[blackdetect @ 0x559298835480] black_start:49.88
ffmpeg -i output.mp4 -vf blackdetect=d=0.1:pix_th=.1 -f rawvideo -y /dev/null 2>&1 | grep -o "black_start:[\.0-9]\+ "
output: black_start:49.88
And crop accordingly;
ffmpeg -i output.mp4 -t 49.88 -c copy finaloutput.mp4
vlc finaloutput.mp4 # Assuming you have vlc installed
ffprobe -v error -show_entries stream=height -of csv=p=0 input.png
- llogan
v
(在此处找到:https://twitter.com/FFmpeg/status/1180179571456372737),使其每秒滚动一次图像(将命令适应为垂直滚动):`ffmpeg -loop 1 -framerate 30 -i input.png -vf“scroll=v=0.001,crop=640:360:0:ih,format=yuv420p”-preset veryslow -crf 18 -t 10 output.mp4`--我发现如果图像被裁剪到自己的高度,则为0.03333,但如果它比裁剪区域更高,则会改变。? - Alex Hall