ffmpeg的创作视频
如何将图片、文字、音频合并起来用代码生成视频,这里推荐个好工具ffmpeg
先来看我的一个demo
ffmpeg -f image2 -loop 1 -t 1 -i ../pic/1.jpg -loop 1 -t 3 -i ../gps/356801031391114.jpg -loop 1 -t 3 -i ../pic/3.jpg -loop 1 -t 3 -i ../pic/4.jpg -loop 1 -t 3 -i ../pic/5.jpg -loop 1 -t 3 -i ../pic/6.jpg -loop 1 -t 3 -i ../pic/7.jpg -loop 1 -t 2 -i ../pic/8.jpg -filter_complex "[0:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v0];[1:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v1];[2:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v2];[3:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v3];[4:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v4];[5:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v5];[6:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v6];[v0][v1][v2][v3][v4][v5][v6]concat=n=7:v=1:a=0,format=yuv420p[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=46:text='2110':x=455:y=748:enable='between(t,0.2,1)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=46:text='2014-04-11':x=249:y=591:enable='between(t,0.2,1)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=56:text='2448':x=336:y=241:enable='between(t,1.5,4)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='161':x=362:y=306:enable='between(t,1.6,4)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='221':x=282:y=366:enable='between(t,1.7,4)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=44:text='...':x=120:y=380:enable='between(t,4.5,7)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='':x=135:y=452:enable='between(t,4.7,7)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=52:text=' 7':x=236:y=402:enable='between(t,7.6,10)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=40:text=' 四川省泸州市':x=440:y=402:enable='between(t,7.7,10)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=70:text='':x=307:y=376:enable='between(t,10.6,13)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=40:text='':x=60:y=451:enable='between(t,10.7,13)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县双水岸小区西南50米(金兰大道北)':x=72:y=460:enable='between(t,13.5,16)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县体育中心北':x=72:y=520:enable='between(t,13.6,16)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县人民医院西南':x=72:y=580:enable='between(t,13.7,16)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=420:enable='between(t,16.7,19)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=476:enable='between(t,16.8,19)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=532:enable='between(t,16.9,19)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=62:text='':x=295:y=762:enable='between(t,19.3,21)'[v];[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=62:text='24164':x=295:y=826:enable='between(t,19.4,21)'[v];[v]concat=n=1:v=1:a=0,format=yuv420p[v]" -vcodec libx264 -r:v 25 -y -map "[v]" 356801031391114_temp.mp4
一行太乱了,来个换行的
ffmpeg -f image2 -loop 1 -t 1 -i 1.jpg -loop 1 -t 3 -i 2.jpg -loop 1 -t 3 -i 3.jpg -loop 1 -t 3 -i 4.jpg -loop 1 -t 3 -i 5.jpg -loop 1 -t 3 -i 6.jpg -loop 1 -t 3 -i 7.jpg -loop 1 -t 2 -i 8.jpg -filter_complex " [0:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v0]; [1:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v1]; [2:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v2]; [3:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v3]; [4:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v4]; [5:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v5]; [6:v]overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'[v6]; [v0][v1][v2][v3][v4][v5][v6]concat=n=7:v=1:a=0,format=yuv420p[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=46:text='2110':x=455:y=748:enable='between(t,0.2,1)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=46:text='2014-04-11':x=249:y=591:enable='between(t,0.2,1)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=56:text='2448':x=336:y=241:enable='between(t,1.5,4)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='161':x=362:y=306:enable='between(t,1.6,4)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='221':x=282:y=366:enable='between(t,1.7,4)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=44:text='...':x=120:y=380:enable='between(t,4.5,7)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=66:text='':x=135:y=452:enable='between(t,4.7,7)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=52:text=' 7':x=236:y=402:enable='between(t,7.6,10)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=40:text=' 四川省泸州市':x=440:y=402:enable='between(t,7.7,10)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=70:text='':x=307:y=376:enable='between(t,10.6,13)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=40:text='':x=60:y=451:enable='between(t,10.7,13)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县双水岸小区西南50米(金兰大道北)':x=72:y=460:enable='between(t,13.5,16)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县体育中心北':x=72:y=520:enable='between(t,13.6,16)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='泸州市古蔺县人民医院西南':x=72:y=580:enable='between(t,13.7,16)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=420:enable='between(t,16.7,19)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=476:enable='between(t,16.8,19)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=24:text='':x=74:y=532:enable='between(t,16.9,19)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=62:text='':x=295:y=762:enable='between(t,19.3,21)'[v]; [v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=62:text='24164':x=295:y=826:enable='between(t,19.4,21)'[v]; [v]concat=n=1:v=1:a=0,format=yuv420p[v] " -vcodec libx264 -r:v 25 -y -map "[v]" 356801031391114_temp.mp4
第一行是输入源;后面[0:v]表示输入源1的视频(V);overlay=x=0:y='if(gte(t,1), max(h-(t-1)*3500,0),NAN)'这个是对[0:v]进行位移控制,就是动画;[v0]相当于处理后新视频片段的变量名。后面几个的解释同上。
[v0][v1][v2][v3][v4][v5][v6]concat=n=7:v=1:a=0,format=yuv420p[v];合并前面几个视频,并且有了新变量名[v]
[v]drawtext=ft_load_flags=render:fontfile=1.ttf:shadowcolor=0xaaaaaa66:shadowx=1:shadowy=1:fontcolor=#e93443:fontsize=46:text='2110':x=455:y=748:enable='between(t,0.2,1)'[v];在变量[v]视频里添加文字,enable='between(t,0.2,1)这个时间点内显示。