如何使用 FFmpeg 从视频中间创建缩略图

Sta*_*bie 12 thumbnails ffmpeg

有没有办法在 FFmpeg 中抓取视频缩略图?

我想抓取最中间的帧作为视频并将其用作缩略图。视频时长未知。

指定缩略图尺寸的能力也很有帮助。

Pro*_*tee 11

一行命令:

ffmpeg -i input.mp4 -vcodec mjpeg -vframes 1 -an -f rawvideo -ss `ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d , | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'` output.jpg
Run Code Online (Sandbox Code Playgroud)

子命令获取输入视频的总时长

ffmpeg -i input.mp4 2>&1 | grep Duration | awk '{print $2}' | tr -d ,
Run Code Online (Sandbox Code Playgroud)

并通过管道将其awk用于计算持续时间/ 2 像这样

echo '00:01:30.000' | awk -F ':' '{print ($3+$2*60+$1*3600)/2}'
Run Code Online (Sandbox Code Playgroud)

所以它在几秒钟内给 -ss 选项,它就完成了。

如果您想指定大小,请添加 -s 选项,例如 WxH,其中 W 和 H 是整数值(例如:-s 800x600 或 -s svga)或阅读 ffmpeg 手册页以查看其他可用选项或格式。

  • `ffmpeg` 输出仅用于提供信息,不用于解析,因此处理它可能被认为是脆弱的。使用 `ffprobe` 来获取持续时间。请参阅 [FFmpeg Wiki:FFprobe 提示](http://trac.ffmpeg.org/wiki/FFprobeTips#Duration)。 (2认同)

slh*_*hck 5

首先,始终使用最新版本的 FFmpeg。

如果您可以访问 PHP,那么您的问题在 Stack Overflow上得到了完美的回答:使用 FFMpeg 获取视频的中间帧?

$output = shell_exec("/usr/local/bin/ffmpeg -i {$path}");
preg_match('/Duration: ([0-9]{2}):([0-9]{2}):([^ ,])+/', $output, $matches);
$time = str_replace("Duration: ", "", $matches[0]);
$time_breakdown = explode(":", $time);
$total_seconds = round(($time_breakdown[0]*60*60) + ($time_breakdown[1]*60) + $time_breakdown[2]);
shell_exec("/usr/local/bin/ffmpeg -y  -i {$path} -f mjpeg -vframes 1 -ss " . ($total_seconds / 2) . " -s {$w}x{$h} {$output_filename}"; 
Run Code Online (Sandbox Code Playgroud)

它会做的只是从 FFmpeg 的输出中提取持续时间并使用它来确定中间帧的时间码。

您可以轻松地将其调整到其他 shell,只需插入以下命令,其中中框大致为534秒:

ffmpeg -y  -i input.mp4 -f mjpeg -vframes 1 -ss 534 thumbnail.jpg
Run Code Online (Sandbox Code Playgroud)

您可以随时更改大小-s 480x320或类似,具体取决于您想要的大小,插入-i input.mp4选项后的某处。


上面的解决方案有点不准确。它会立即给你一个结果,但你不能指定你想要的帧。如果您已经知道要提取的确切帧,请使用select过滤器,例如使用帧编号12345

ffmpeg -i input.mp4 -filter:v select="eq(n\,12345)" -vframes 1 thumbnail.jpg
Run Code Online (Sandbox Code Playgroud)

请注意,此命令可能需要一段时间,因为它需要跳到指定的帧才能提取它。


llo*_*gan 5

这是一种使用方法:

  • ffprobe 获取持续时间
  • bc 计算持续时间的一半
  • ffmpeg 制作缩略图

例子:

input=input.mp4; ffmpeg -ss "$(bc -l <<< "$(ffprobe -loglevel error -of csv=p=0 -show_entries format=duration "$input")*0.5")" -i "$input" -frames:v 1 half.png
Run Code Online (Sandbox Code Playgroud)