用于自动视频分割和缩略图创建的 FFMPEG 命令

FFMPEG command for automatic video splitting and thumbnail creation

我正在尝试编写一个 FFMPEG 命令:

举个例子,下面是 运行 脚本后文件夹应该包含的内容:

input.mp4 <-- video to be splitted
pic.jpg <-- Base for thumbnail

[0].mp4 <-- first 20 seconds of input.mp4
[0].jpg <-- thumbnail image with "0" printed on

[1].mp4 <-- second 20 seconds of input.mp4
[1].jpg <-- thumbnail image with "1" printed on

... and so on

这是我现在的命令:

ffmpeg -i input.mp4 -i pic.jpg -f segment -segment_time 20 -map 0:a -map 0:v -vcodec copy -reset_timestamps 1 output[%d].mp4 -map 1:v -vf "drawtext=text=%d:fontcolor=white:fontsize=75:x=1002:y=100:" pic[%d].jpeg

但出现多个问题:

通知 我不能使用 bash 脚本或类似的

tl;dr - 无能为力。可能分3步就可以了。

%d is not recognized by drawtext (it says stray % before d)

不应该的。它的文档中没有任何地方谈到它支持 c-printf 格式字符串。

If I remove %d from drawtext (substituting it with 'Exampletext'), the script splits correctly the video, but creates only pic[1].jpg, without anything written on it. No other .jpg files seem to be created.

这是预期的行为,因为 pic.jpg 输入流在 1 帧后消失(因为它是静止图片 = 只有 1 帧长)。您可以循环输入图像(查找 image2 多路分解器文档),但您必须提前知道要生成的片段数(更不用说这是一个有争议的问题,因为预期的 drawtext手术是不行的)。

我能想到的唯一解决方法是分 3 步完成此操作:

  1. 调用 FFmpeg 来完成 segment 工作
  2. 计算创建的片段数,并创建一个字幕文件(.srt 就足够了)。每段占1秒。
  3. 使用 pic.jpg 输入再次调用 FFmpeg,循环它以在 1-fps 帧速率下产生与段数匹配的帧数。使用 subtitle 过滤器在字幕中指定的段号中刻录。

显然,在脚本中自动执行上述操作很有意义,但手动完成上述操作比单独为每个缩略图编号要省力得多。