FFmpeg 可以从视频中捕获图像,这些图像可以用作缩略图来表示视频。在FFmpeg Wiki中捕获了最常见的方法。
但是,我不想在某些时间间隔内选择随机帧。我发现了一些在 FFmpeg 上使用过滤器来捕捉场景变化的选项:
过滤器thumbnail试图找到视频中最具代表性的帧:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
Run Code Online (Sandbox Code Playgroud)
并且以下命令仅选择与之前相比具有超过 40% 变化的帧(因此可能是场景变化)并生成 5 个 PNG 的序列。
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Run Code Online (Sandbox Code Playgroud)
以上命令的信息归功于Fabio Sonnati。第二个看起来更好,因为我可以得到 n 个图像并选择最好的。我试过了,它生成了 5 次相同的图像。
更多的调查使我:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
Run Code Online (Sandbox Code Playgroud)
-vsync vfr确保您获得不同的图像。这仍然总是选择视频的第一帧,在大多数情况下,第一帧是署名/标志并且没有意义,所以我添加了一个-ss3 来丢弃视频的前 3 秒。
我的最终命令如下所示:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Run Code Online (Sandbox Code Playgroud)
这是我能做的最好的事情。我注意到,由于我只挑选了5个视频,所有视频都来自视频的开头,可能会错过视频后面出现的重要场景。
我想为任何其他更好的选择挑选你的大脑。
我正在尝试通过 ImageMagick 从视频中提取缩略图。我从他们的官方网站上找到了一些示例,但它制作的是 GIF,而不是 PNG。不过我想要一个纯缩略图。
它可以创建与此 ffmpeg 命令相同的输出吗?
ffmpeg -ss 600 -i myVideo.mp4 -vframes 1 -s 420x270 Out.bmp
Run Code Online (Sandbox Code Playgroud) 我正在寻找适用于 Linux 的最快的命令行图像转换器,它可以读取 JPEG 图像,将其缩小到最多 1366x768,并写入质量为 50 的 JPEG 图像。像这样,但比 ImageMagick 快得多:
$ convert -resize x768 -quality 50 foo42.jpg foo42.th.jpg
# takes 0m16.713s for my test image set
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
$ <foo42.jpg djpeg | pnmscale -xysize 1366 768 | cjpeg -quality 50 >foo42.th.jpg
# takes 0m12.007s for my test image set, and has lower visual quality than ImageMagick
Run Code Online (Sandbox Code Playgroud)
所以我想要一个程序,最好是用 C 编写的,它集成了 djpeg、更高质量的 pnmscale 版本和 cjpeg。
我刚刚找到了swiggle(一个使用 libjpeg 的 C 程序),我在源代码中禁用了一些我不需要的功能,我有:
$ swiggle -f -H 768 .
# takes 0m11.378s …Run Code Online (Sandbox Code Playgroud) 我需要一个“好”的 Mac 缩略图生成器。有什么建议?
一些标准:
该软件的唯一目的应该是输出缩略图。
谢谢!