用于自动视频分割和缩略图创建的 FFMPEG 命令
FFMPEG command for automatic video splitting and thumbnail creation
我正在尝试编写一个 FFMPEG 命令:
- 作为输入一个视频input.mp4和一个图像pic.jpg
- As an output 将 input.mp4 分割成 20 秒的视频,并按顺序重命名;对于每个分割视频,它通过复制pic.jpg创建一个缩略图,在上面写上相应的订单号,并使用与名称相同的订单号保存。
举个例子,下面是 运行 脚本后文件夹应该包含的内容:
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
但出现多个问题:
%d
不被 drawtext
识别(它说 stray % before d)
- 如果我从 drawtext 中删除
%d
(用 'Exampletext'
代替),脚本会正确分割视频,但只创建 pic[1].jpg,上面没有写任何东西。似乎没有创建其他 .jpg 文件。
通知
我不能使用 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 步完成此操作:
- 调用 FFmpeg 来完成
segment
工作
- 计算创建的片段数,并创建一个字幕文件(.srt 就足够了)。每段占1秒。
- 使用
pic.jpg
输入再次调用 FFmpeg,循环它以在 1-fps 帧速率下产生与段数匹配的帧数。使用 subtitle
过滤器在字幕中指定的段号中刻录。
显然,在脚本中自动执行上述操作很有意义,但手动完成上述操作比单独为每个缩略图编号要省力得多。
我正在尝试编写一个 FFMPEG 命令:
- 作为输入一个视频input.mp4和一个图像pic.jpg
- As an output 将 input.mp4 分割成 20 秒的视频,并按顺序重命名;对于每个分割视频,它通过复制pic.jpg创建一个缩略图,在上面写上相应的订单号,并使用与名称相同的订单号保存。
举个例子,下面是 运行 脚本后文件夹应该包含的内容:
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
但出现多个问题:
%d
不被drawtext
识别(它说 stray % before d)- 如果我从 drawtext 中删除
%d
(用'Exampletext'
代替),脚本会正确分割视频,但只创建 pic[1].jpg,上面没有写任何东西。似乎没有创建其他 .jpg 文件。
通知 我不能使用 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 步完成此操作:
- 调用 FFmpeg 来完成
segment
工作 - 计算创建的片段数,并创建一个字幕文件(.srt 就足够了)。每段占1秒。
- 使用
pic.jpg
输入再次调用 FFmpeg,循环它以在 1-fps 帧速率下产生与段数匹配的帧数。使用subtitle
过滤器在字幕中指定的段号中刻录。
显然,在脚本中自动执行上述操作很有意义,但手动完成上述操作比单独为每个缩略图编号要省力得多。