V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jifengg
V2EX  ›  分享创造

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

  •  
  •   jifengg · 4 天前 · 859 次点击

    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,它允许我们自定义过渡效果。不过这个在网上资料很少,正在研究,有点成果但不多。等我研究透了再更新。

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

    10 条回复    2024-06-26 11:22:07 +08:00
    flyn
        1
    flyn  
       4 天前 via Android
    很实用,感谢分享
    ToDayMkCode
        2
    ToDayMkCode  
       4 天前
    ffmpeg 处理是不是很耗性能呀!
    jifengg
        3
    jifengg  
    OP
       4 天前
    @ToDayMkCode 确实耗性能,但是应该没有比 ffmpeg 更高效的方法了。另外如果有显卡,-c:v 可以传入 ffmpeg 支持的硬件编码,比如 N 卡的 h264_nvenc ,intel 集显或独显的 h264_qsv 等。
    可以下载了脚本自己试试,win\linux\mac 都支持的
    ashin
        4
    ashin  
       4 天前 via iPhone
    不错,已 star
    rekulas
        5
    rekulas  
       4 天前
    我们以前也做过,嫌 xfade 的太普通了,直接扒剪映的 shader 过来修改后喂给 ffmpeg ,就可以实现很炫的转场 😂
    jifengg
        6
    jifengg  
    OP
       4 天前
    @rekulas 厉害的。想知道这套操作是需要修改 ffmpeg 源码然后重新编译吗?
    rekulas
        7
    rekulas  
       4 天前
    @jifengg 不需要修改但需要编译下 我记得好像是编译了这个插件,然后就可以很方便的调用 glsl 了
    https://gl-transitions.com/
    jifengg
        8
    jifengg  
    OP
       4 天前
    @rekulas 哦,原来是这个,之前在搜索 ffmpeg 转场效果的时候看过这个。奈何不会编译
    iMusic
        9
    iMusic  
       3 天前
    @rekulas #7 谢谢提供思路,有空试试
    Smilencer
        10
    Smilencer  
       3 天前 via iPhone
    感谢分享,有空试下效果呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2567 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:55 · PVG 17:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.