使用 ffmpeg,将多张图片转换成类似幻灯片的视频,支持多种转场效果

6 天前
 jifengg

hello ,兄弟们,我又来分享我的 ffmpeg 脚本啦。

这次分享的是一个图片转视频的功能。这个功能之前有 v 友问过,这不来了嘛。

这个脚本其实可以算是我编写的最早的一个 ffmpeg 脚本,只是一直没有再好好整理,这次正好趁着往脚本集添加的机会,重新梳理了一些逻辑、修复了一些 bug 、增加了一些配置项。

先看效果

gif 效果不好,请直接看视频( 394k ): https://github.com/jifengg/ffmpeg-script/assets/17020523/fb0c9182-9161-4692-8884-a5faa98a3abd

为了不造成困扰,示例里没有添加音频和字幕,实际是支持的。

开源地址

GitHub 地址:https://github.com/jifengg/ffmpeg-script

运行脚本后,会扫描输入目录下的图片、音频、字幕文件(其中图片必须有,音频字幕可以没有,如果有则取第一个)。 根据命令行传入的不同参数配置,生成一个类似幻灯片的视频文件,加入各种转场效果。

这里列出脚本支持的参数,更多的使用方法可以到 github 中查看。

node ffmpeg.img2video.js -i <folder> [-o <file> ...]
-preset     <string>    本脚本除了-preset 之外的所有参数,均可以通过传递 preset 文件来设置。
                        如果使用./preset/abc.preset 来设置,则-preset abc 即可。
                        preset 文件的编写请参考 github ( https://github.com/jifengg/ffmpeg-script )。                            
-i          <string>    [必须]要处理的图片/音频/字幕文件所在的目录,扫描时不包含子目录。
                        支持的图片:jpg jpeg png bmp webp
                        支持的音频:mp3 aac wav flac wma ape
                        支持的字幕:lrc srt ass
-o          <string>    视频文件的保存路径,默认为输入目录/output.mp4
 -display   <string>    图片的显示方式,默认为 contain 。可选值为:
                        original:原图;
                        contain:等比例缩放至显示全图,可能有黑边;
                        cover:等比例缩放至能覆盖整个画面,可能有裁剪。
                        fill:拉伸变形至填充整个画面
 -fps       <number>    输出视频的帧率,默认:25
 -crf       <number>    ffmpeg 控制输出视频质量的参数,越小画面质量越好,视频文件也会越大,建议 18~30 之间。默认:23
 -c:v       <string>    输出视频的编码器,默认:h264
 -c:a       <string>    输出视频的音频编码器,默认:aac
 -width     <number>    输出视频的宽度,默认:1920
 -height    <number>    输出视频的高度,默认:1080
 -td        <number>    图片切换动画时长,默认为 4 秒
 -sd        <number>    图片独立显示时长,默认为 7 秒
 -repeat                图片数量太少导致视频时长比音频时长短的时候,循环图片以达到音频的时长。默认:不循环
-y                      覆盖已经存在的输出文件,默认:false
-h                      显示这个帮助信息
-debug                  开启 debug 模式,打印更详细的日志

主要是应用了 ffmpeg 的过滤器xfade

使用 nodejs 是为了支持批量处理,以及将复杂化的命令行用简单的命令来代替。最终是生成一个 ffmpeg 命令行来进行所有处理。

如果你对 ffmpeg 开发也感兴趣,关于这个脚本的技术文章可以查看这里ffmpeg.img2video.md

另外,xfade 提供有 56 种内置效果,能满足大部分需求。不过,更复杂的过渡效果(例如翻页)还没有。
这个过滤器还有一个参数expr,它允许我们自定义过渡效果。不过这个在网上资料很少,正在研究,有点成果但不多。等我研究透了再更新。

脚本目前的参数配置还比较粗糙,转场效果用的是随机的,时长控制是统一的。后续考虑增加一些项目文件之类的文件,可以自主的控制每个图片的转场效果、持续时长、显示类型等等。如果你有类似的需求可以关注我。

875 次点击
所在节点    分享创造
10 条回复
flyn
6 天前
很实用,感谢分享
ToDayMkCode
6 天前
ffmpeg 处理是不是很耗性能呀!
jifengg
6 天前
@ToDayMkCode 确实耗性能,但是应该没有比 ffmpeg 更高效的方法了。另外如果有显卡,-c:v 可以传入 ffmpeg 支持的硬件编码,比如 N 卡的 h264_nvenc ,intel 集显或独显的 h264_qsv 等。
可以下载了脚本自己试试,win\linux\mac 都支持的
ashin
6 天前
不错,已 star
rekulas
6 天前
我们以前也做过,嫌 xfade 的太普通了,直接扒剪映的 shader 过来修改后喂给 ffmpeg ,就可以实现很炫的转场 😂
jifengg
6 天前
@rekulas 厉害的。想知道这套操作是需要修改 ffmpeg 源码然后重新编译吗?
rekulas
6 天前
@jifengg 不需要修改但需要编译下 我记得好像是编译了这个插件,然后就可以很方便的调用 glsl 了
https://gl-transitions.com/
jifengg
6 天前
@rekulas 哦,原来是这个,之前在搜索 ffmpeg 转场效果的时候看过这个。奈何不会编译
iMusic
6 天前
@rekulas #7 谢谢提供思路,有空试试
Smilencer
5 天前
感谢分享,有空试下效果呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1052395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX