使用ffmpeg制作时光影集

news/2024/11/23 9:14:17/

目前QQ、剪影等都有照片制作成视频的功能。研究一段时间,始终不得要点。目前能实现的方式有h5动感影集、webv格式视频以及传统的ffmpeg进行照片合成剪辑。H5动感影集没办法导出成视频、webv对于视频的编辑依托于js。因此最终选择了利用ffmpeg来实现。由于语言使用的是C#,所以只能利用windows命令来调用。如果使用nodejs,可以使用封装好的方法fluent-ffmpeg。
对于ffmpeg的各类命令,可以在网上搜索出来。但是大都是满足某一场景,最好还是自己研究参数。进入ffmpeg的官网,里面对每一个属性都有说明和示例。http://ffmpeg.org/ffmpeg-all.html
本示例实现的是多张照片合成一个视频。照片实现的效果有渐入渐出、放大、移动、模糊处理,视频可以添加背景音乐。整体思路是,读取某一文件夹中的所有照片,逐个加入ffmpeg动效参数,然后拼接成一个长的命令字符串,使用Process命令行调用ffmpeg执行该命令。
具体效果如下:
核心代码如下:

     public static string GetCommand(string[] files)
{//string[] files = Directory.GetFiles("d:/yb/ffmpeg/pic/", "*.jpg");StringBuilder sbFile = new StringBuilder();StringBuilder sbFilter = new StringBuilder();StringBuilder sbConcat = new StringBuilder();int w = 540;int h = 720;int second = 4;for (int i = 0; i < files.Length; i++){sbFile.Append(string.Format("-i {0} ", files[i]));Image img = Image.FromFile(files[i]);int th = img.Height * w / img.Width;int offset = (second - 1) * i;string fade = string.Empty;if (offset > 0){fade = string.Format(",fade =in:d = 1:alpha = 1,setpts = PTS - STARTPTS + {0} / TB", offset);}// 如果是宽图片,则需要添加模糊背景,采用横向滚动的方式if (th < h * 0.8){sbFilter.Append(string.Format(" [{0}]zoompan=d={1}:s={2}x{3}, boxblur=10{4}[bg{5}];", i, second * 25, w, h, fade, i));sbFilter.Append(string.Format("[{0}]zoompan=z='{1}':x='if(lte(on,-1),(iw-iw/zoom)/2,x+{2})':d={3}:s={4}x{5}{6}[v{7}];", i, 1.5, (1.5 - 1) * w / ((second+1) * 25), second * 25, w, th, fade, i));if (i > 0){sbConcat.Append(string.Format("[c{0}][bg{1}]overlay[cc{2}];", i - 1, i, i));sbConcat.Append(string.Format("[cc{0}][v{1}]overlay=y=(H-h)/2[c{2}];", i, i, i));}else{sbConcat.Append(string.Format("[bg0][v0]overlay=y=(H-h)/2[c0];"));}}else{//长图,假设比例合适//sbFilter.Append(string.Format(" [{0}]zoompan=d={1}, boxblur=10{2}[bg{3}];", i, second * 25, fade, i));//sbFilter.Append(string.Format("[{0}]zoompan=z='{1}':x='if(lte(on,-1),(iw-iw/zoom)/2,x+{2})':d={3}:s={5}x{6}{7}[v{8}];", i, 1.3, (1.3 - 1) * w / (second + 1), second * 25, w, th, fade, i));string[] effects = { "z='min(max(zoom,pzoom)+0.0015,1.5)'", "z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.0015))':y='ih*(1-max(zoom,pzoom))'", "z='1.5':x='if(lte(on,-1),(iw-iw/zoom)/2,x+1.25)'", "z='1.5':y='if(lte(on,-1),(ih-ih/zoom)/2,y+1.25)'" };// Random rn = new Random();string effect = effects[i%4];sbFilter.Append(string.Format(" [{0}] zoompan =d = {1}:{2}:s={3}x{4}{5}[{6}];", i, 125, effect, w, h, fade, i == 0 ? "c0" : "v" + i));if (i > 0){sbConcat.Append(string.Format("[c{0}][v{1}]overlay[c{2}];", i - 1, i, i));}}}sbFile.Append("-i d:/yb/ffmpeg/music/02.mp3 ");string concat = sbConcat.ToString();concat = concat.Substring(0, concat.LastIndexOf('['));string result = string.Format("-y {0} -filter_complex \"{1} {2}, format=yuv420p[v]\"  -map \"[v]\"  -map {3}:a -shortest -movflags +faststart {4}", sbFile.ToString(), sbFilter.ToString(), concat, files.Length, "d:/yb/ffmpeg/video/" + DateTime.Now.ToString("HHmmss") + ".mp4");return result;
}

重点参数解释:
模糊化效果
string.Format(" [{0}]zoompan=d={1}:s={2}x{3}, boxblur=10{4}[bg{5}];", i, second * 25, w, h, fade, i)
[0]:代表操作第一个图片;
[bg0]:代表将[0]第一个图片做成的视频命名为bg0;
zoompan:主要使用该属性来实现效果,d为总帧数,默认的fps为25帧,如果要设置一个5s的效果,那么d就可以设置为125;当然如果为了提高流畅度,可以这样设置一个5s的效果zoompan=d=300:fps=60; s代表第一个照片输出的尺寸,固定尺寸后可以放大再 进行移动。以上的命令字符串代表让第n个照片boxblue模糊后作为底层;
sbFilter.Append(string.Format(" [{0}]zoompan=d={1}:s={2}x{3}, boxblur=10{4}[bg{5}];", i, second * 25, w, h, fade, i));
sbFilter.Append(string.Format("[{0}]zoompan=z=’{1}’:x=‘if(lte(on,-1),(iw-iw/zoom)/2,x+{2})’:d={3}:s={4}x{5}{6}[v{7}];", i, 1.5, (1.5 - 1) * w / ((second+1) * 25), second * 25, w, th, fade, i));
let:小于等于;gte:大于等于。
将图片首先以背景模糊输出,然后在同一时间段覆盖上图片动效。效果如下:
在这里插入图片描述
sbConcat.Append(string.Format("[c{0}][bg{1}]overlay[cc{2}];", i - 1, i, i));
sbConcat.Append(string.Format("[cc{0}][v{1}]overlay=y=(H-h)/2[c{2}];", i, i, i));
合并视频,此处采用的是overlay覆盖合并,concat是顺序合并。将c0视频覆盖在bg0视频上,合并后的视频命名为cc0;将cc0视频合并到v0视频上,位置是垂直居中;
fade = string.Format(",fade =in:d = 1:alpha = 1,setpts = PTS - STARTPTS + {0} / TB", offset);
fade是渐入渐出的控制;in/out渐入/减出;d=1为渐变时间持续1s;setpts 是为了让第一个视频渐出的时间和第二个视频渐入的时间进行重叠,不至于突然变黑很突兀。setpts = PTS - STARTPTS + {0} / TB,offset是第二个视频渐入的时间,比如两个5s的视频,该值应该这是为4,在第4秒进行渐入;
代码可在此处下载https://download.csdn.net/download/wuwo333/12500865


http://www.ppmy.cn/news/277637.html

相关文章

影集电子相册制作系统普及版 39.9.7已注册版

影集制作系统普及版&#xff08;新增生成高清晰Flash电子相册&#xff0c;生成的Flash电子相册可以拷到手机&#xff08;3G手机&#xff09;、MP4等设备直接运行播放&#xff0c;新增相片合成功&#xff09;&#xff0c;能生成书本式电子相册、画卷式电子相册&#xff0c;导入歌…

动感的网页相册

不知道大家有没有这样的体验,windows电脑上查看一张gif图,默认就把IE给打开了,还弹出个什么询问项,好麻烦的感觉。所以为了解决自己的这个问题,写了个简单的文件夹内图片浏览工具。 效果图 以E盘某一文件夹为例 效果图 实现思路 Created with Raphal 2.1.0

三维动画与企业宣传片的制作方案

一、企业宣传片与3D动画制作方案 随着社会进步&#xff0c;虚拟动画技术的不断发展走向成熟&#xff0c;3D动画宣传片逐渐成为各大企业最为具有实战常用的一种宣传方式&#xff0c;是一个能够反映真实世界的概念&#xff0c;三维动画有许多制作方式&#xff0c;比如运用C4D、3D…

我用css3为好友胡歌的宝宝做了一个动画照片墙

软件人生风雨十年&#xff0c;仙剑一过去也有十年有余了&#xff0c;和胡歌认识那么久&#xff0c;今日喜闻好友胡歌生宝宝的消息&#xff0c;惊喜之余用css3为胡歌的宝宝做了动画照片墙的模板效果。 目录 1. 实现思路 2. 墙体的实现 3. 选取模板素材&#xff0c;进行图片元…

数字科技立体空间感图片/照片逐张展示PR视频模板

数字科技立体空间感图片/照片逐张展示PR视频模板 Premiere Pro 2021 无需插件 全高清分辨率 图层控制 持续时间1:45秒 29图像/视频占位符 29文本占位符 项目组织良好 详细视频教程 不包括图像和声音

计算机如何制作音乐相册,电脑电子相册制作软件 精美的音乐电子相册制作方法...

平时总喜欢拍摄各种照片&#xff0c;制作电子相册一直是很多小伙伴关注的话题之一&#xff0c;并且有很多小伙伴都不知道该如何制作&#xff0c;甚至还没有自己动手尝试操作就找别人帮忙制作了&#xff0c;一两次还好说&#xff0c;总不可能每次制作电子相册都找他人帮忙吧&…

制作3D浪漫炫酷相册【附源码】

制作3D浪漫炫酷相册【附源码】 我的网站已经上线了 http://javapub.net.cn/ 博主介绍&#xff1a; &#x1f680;自媒体 JavaPub 独立维护人&#xff0c;全网粉丝15w&#xff0c;csdn博客专家、java领域优质创作者&#xff0c;51ctoTOP10博主&#xff0c;知乎/掘金/华为云/阿里…

56相册视频(土豆相册视频 激动相册视频 QQ动感影集等)——下载教程

由于目前流行的相册视频或影集大多是由Flash、音乐和图片组合而成的动画&#xff0c;不属于完整视频&#xff0c;所以不能用常规的解析方法下载。 鉴于很多朋友希望可以下载自己精心制作的相册&#xff0c;故在本教程中&#xff0c;我们将以图文并茂的方式为大家介绍详细的相册…