需求是合并多个图片为视频,并在每个图片衔接处加入转场特效,第一种方式是用fade做转场,第二种方式是xfade做转场,xfade的转场特效更多,建议用这个。如果对你有帮助,点赞+收藏。
第一种:直接用fade做转场
ffmpeg \
-loop 1 -t 5 -i 1.jpg \
-loop 1 -t 5 -i 2.jpg \
-loop 1 -t 5 -i 3.jpg \
-loop 1 -t 5 -i 4.jpg \
-loop 1 -t 5 -i 5.jpg -filter_complex "[0:v]fade=t=out:st=4:d=1[v0]; [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
转场特效,可以在:https://trac.ffmpeg.org/wiki/Xfade#MP4output 查看
第二种:利用xfade做转场
ffmpeg \
-loop 1 -t 2 -i 1.jpg \
-loop 1 -t 2 -i 2.jpg \
-loop 1 -t 2 -i 3.jpg \
-loop 1 -t 2 -i 4.jpg \
-loop 1 -t 2 -i 5.jpg \
-filter_complex "[0:v]xfade=transition=wiperight:duration=1:offset=1[v0]; [1:v]xfade=transition=wiperight:duration=1:offset=1[v1]; [2:v]xfade=transition=wiperight:duration=1:offset=1[v2]; [3:v]xfade=transition=wiperight:duration=1:offset=1[v3]; [v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]" -map "[v]" -y out.mp4
添加背景音乐
#简单命令:
ffmpeg -i 1.mp3 -i circlecrop.mp4 -shortest \
-c:v libx264 \
-y BGM.mp4
# 复杂命令:
ffmpeg \
-loop 1 -t 2 -i 1.jpg \
-loop 1 -t 2 -i 2.jpg \
-loop 1 -t 2 -i 3.jpg \
-loop 1 -t 2 -i 4.jpg \
-loop 1 -t 2 -i 5.jpg \
-stream_loop -1 -i 1.mp3 -acodec aac \
-filter_complex "[0:v]xfade=transition=circlecrop:duration=1:offset=1[v0]; [1:v]xfade=transition=circlecrop:duration=1:offset=1[v1]; [2:v]xfade=transition=circlecrop:duration=1:offset=1[v2]; [3:v]xfade=transition=circlecrop:duration=1:offset=1[v3]; [v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]" -map "[v]" \
-map "5:a" \
-shortest \
-c:v libx264 \
-y circlecrop.mp4
-stream_loop
输入流循环的次数,0 表示无循环,-1 表示无限循环,即音乐循环播放。
-acodec aac
设置音频编解码为 acc 模式
-map “[v]”
将合成的视频输入流 v 指定为输出文件的源
-map “5:a”
将第6个文件作为视频音频文件
-shortest
最短的输入流结束时,完成编码。
-c:v libx264
输出视频编码格式
-pix_fmt yuv420p
设置像素格式为 yuv420p