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

使用 ffmpeg 将视频画面拼接上自定义的字幕,生成字幕拼接图片

  •  
  •   jifengg · 12 天前 · 874 次点击

    网络上经常可以看到一些“截图某一张视频画面,并把后续字幕连续拼接在一起”的图片,可以快速传递视频内的内容。
    当然,这很容易造假。所以当你看到类似内容的时候,需要自行判断。
    这个脚本,就是用来实现这个功能的。需要说明的是,这个脚本不是为了造假而生的,仅仅是出于娱乐与交流的目的。

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

    比如我用“功夫熊猫 4”里的某个画面,搭配我自己编写的一段话,生成:

    效果图

    脚本运行时间 2 秒左右。

    使用方式:

    node ffmpeg.subtitle.stack.js -i <video_file> -t <text_file> -font <font_file> [-o <output> ...]
    

    支持的参数:

    -i          <string>    [必须]视频文件路径
    -t          <string>    [必须]文本文件路径。用两个换行符分隔的字幕,支持用一个换行符实现字幕换行
    -o          <string>    生成的图片文件路径,默认:<输入视频文件名>_subtitle.jpg
    -y                      是否覆盖已经存在的图片文件,默认:false
    -size       <number>    生成的图片宽度,默认:400
    -ss         <number>    从视频的第几秒开始处理,格式同 ffmpeg 的-ss ,默认:0
    -interval   <number>    截取视频画面的两帧之间的间距,单位秒,默认:5
    -sh         <number>    要截取的字幕区域占画面高度的比例,取值 0.0 (不含) ~ 1.0 (含),默认:0.1666
    -font       <string>    字体文件路径,非 windows 下使用时必传,默认:c:/Windows/Fonts/msyh.ttc (微软雅黑)
    -h                      显示这个帮助信息
    -debug                  是否开启 debug 模式,打印更详细的日志
    

    注意文本文件的编写要求,格式如下:

    第一行
    first line
    
    第二行
    second line
    
    其它
    others
    

    使用一个空行(\n\n )来分隔两个文本信息,只间隔一个\n 的文本会以多行字幕的形式绘制到画面上。

    技术点主要是对 ffmpeg 各种滤镜的应用,有:

    4 条回复    2024-05-08 14:00:41 +08:00
    cheneydog
        1
    cheneydog  
       12 天前
    有趣
    chenliang0571
        2
    chenliang0571  
       12 天前
    文本字幕不能指定时间的嘛?
    jifengg
        3
    jifengg  
    OP
       12 天前
    @chenliang0571 目前不能,如果有需要可以自行修改脚本添加。其实没太大必要,毕竟画面只截取那一小段
    1044523901
        4
    1044523901  
       11 天前
    不错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 20:33 · PVG 04:33 · LAX 13:33 · JFK 16:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.