使用ffmpeg从视频创建缩略图

37

我需要在上传视频到CDN的同时创建视频缩略图。

我一直在寻找这个功能,发现了这篇文章,但是我即使按照步骤操作,也无法截取视频画面。

我正在使用jwplayer播放视频,详情请参考此处

请问有人能帮我使用ffmpeg在上传视频时创建缩略图吗?

5个回答

91

我不知道如何在上传时截屏,但是我知道如何在上传后截屏。

最简单的代码是:

ffmpeg -i input.mp4 -ss 00:00:01.000 -vframes 1 output.png

在上传文件后运行此脚本。如果在视频开始时(例如前一分钟)拍摄屏幕截图,则应该只需要很短的时间。

我认为在文件仍在上传过程中拍摄屏幕截图是不可能的。

编辑: 从ffmpeg中删除-f image2,因为它被正确猜测了。


2
通常可以从输出文件扩展名猜测格式,因此这里不需要使用“-f image2”。 - llogan
3
如果您在-i之前加上-ss,那么您就无需等待第一分钟的帧通过。但是,大多数解码器无法精确到达时间戳,因此您可能会略微早于您的时间戳(例如,00:00:58而不是00:01:00)。 - Suchipi
什么是 $ 符号? - Shayan
2
@Shayan 这只是一个通用占位符。要更清楚,他可以简单地使用 input.mp4。在某些语言中,$ 表示变量。 - llogan
但如果小于1秒,会怎样呢? - Rizwan Ahmed
显示剩余7条评论

17

其他答案都可以接受...但对于大多数“视频”内容,JPEG是一个更节省空间的缩略图选择。 这个回答讨论了JPEG质量设置。

而且通常您需要指定缩略图大小 - 下面的命令(来源)将对视频进行缩小以适合320x320的框中(通过减小较小的边来保持长宽比 - 即长边为320px):

ffmpeg -ss 00:00:01.00 -i input.mp4 -vf 'scale=320:320:force_original_aspect_ratio=decrease' -vframes 1 output.jpg

太棒了。这很重要。没有人提到设置图像质量。谢谢。 - Srikanth
太棒了。这很重要。没有人提到过设置图像质量的事情。谢谢。 - undefined
“-vframes 1” 会导致生成一张黑色的空白图片。 - PauAI

7
根据这份文档https://trac.ffmpeg.org/wiki/Seeking和我的个人测试,你应该像这样交换-ss和-i的位置。
ffmpeg -ss 00:00:01.000 -i input.mp4 -vframes 1 output.png

操作将变得更快,因为不需要进行视频解码。视频将使用关键帧进行解析,这非常快速。

0
$ffmpegPath = exec('which ffmpeg');
$ffprobePath = exec('which ffprobe');

$command = "$ffprobePath -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $input_video";
$video_duration = shell_exec($command);

$thumbnails_output = 'output%02d.png';
$command = "$ffmpegPath -i $input_video -vf fps=3/$video_duration $thumbnails_output";
shell_exec($command)

仅提供代码的答案不被认为是好的答案,很可能会被投票降低和/或删除,因为它们对学习者社区来说不太有用。带有解释的答案总是更有帮助的。解决方案对您来说可能很明显,但对其他人来说可能不是。请解释它的作用以及与现有答案的区别。否则,此答案可能会被标记为低质量。以下是一些如何编写良好答案的指南? - Jan

0
这是我的Bash脚本,用于创建n个视频缩略图(在示例中有11个,但您可以更改它)。 它会在整个视频的正常间隔时间内执行此操作。
#!/bin/bash

for input_video in "$@"
do
  duracion=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$input_video");
  #echo $duracion;

  ffmpeg -i "$input_video" -vf fps=11/$duracion "$input_video%02d.png";
  #echo "  ffmpeg -i \"$input_video\" -vf fps=3/$duracion  \"$input_video%02d.png\"";

done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接