FFMPEG:将视频转换为动画 Gif 预览,每隔一段时间获取一帧

FFMPEG:将视频转换为动画 Gif 预览,每隔一段时间获取一帧

我想为我的应用程序生成一个 gif 预览,并使用 FFMPEG 在我的服务器上制作它。

如果可能的话,它应该为每个视频生成一个包含 10 帧的 gif,但不使用临时目录(或与每帧相关的临时文件)。

关于这个答案超级用户网,它应该使用每一帧生成一个 gif,这不是我需要的。

看起来很奇怪,但我需要的效果是你可以在许多色情网站上看到的(我不记得这些是什么)

答案1

如果我理解正确的话,FFmpeg Wiki 上的这篇文章名为“每隔 X 秒为视频创建一个缩略图”表明 FFmpeg 无法完成您希望它执行的操作(没有一些自动计算)。

维基百科说这-vf "fps=fps=XYZ"是你最好的选择 - 它将为XYZ原始视频的每一帧创建一个缩略图/帧。如果你真的想要每个视频有 10 张图片,而且它们的长度都不同,你可以先读出总帧数,然后使用脚本计算所需的 fps:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

例如,在您的情况下wanted_frames_times_actual_fps10*25(PAL) 或(NTSC) ,其中表示小时,表示分钟,表示秒,表示帧(在最后计算的秒之后)。10*30total_frames_of_vid=(hh*3600+mm*60+ss)*25+ffhhmmssff计算示例:每秒 25 帧的时间码01:35:45:24(或按照 FFmpeg 的术语,因为 FFmpeg 不使用帧而是毫秒)总共类似于 143649 帧。01:35:45.960

这个解决方案可以很好地发挥作用 - 您只需要找到一种方法来获取视频的总时间(例如通过 ffprobe)及其 fps(如果您无法获得正确的时间码),然后将该信息存储为名为的变量$total_frames_of_vid


我在 Wiki 的“另见”部分找到了另一种方法,链接到 超级用户问题“使用 FFmpeg 为视频制作有意义的缩略图”建议使用:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(我稍微修改了代码 - 将图像编解码器更改为 PNG,并更改了-frames:v和的值fps。还将输出图像的名称更改为包含三名数字。)

然后将它们重新编码为您的 GIF。

该解决方案还需要一些计算或手工劳动,因为所有选项的值(特别是fps需要根据视频的长度而改变。例如,我尝试了超级用户的原始代码和 35 分钟的视频 - 但只得到了 5 帧。

相关内容