使用ffmpeg生成视频缩略图而不产生任何失真

4
要从视频中获取一个 200x100 的缩略图,可以使用命令 ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -s 200x100 image.jpg。但如果源视频的宽高比与 200x100 不同,缩略图会被扭曲(横向或纵向被拉伸或压缩),看起来不好看。
是否有一种方法让 ffmpeg 自动计算出例如 500x200 的视频比 200x100100px,然后从左右两边各去掉 50px,使视频变成 400x200?由于 400x200200x100 具有相同的宽高比,因此缩略图将不会被扭曲。
我知道有其他工具可以对 ffmpeg 生成的缩略图进行这样的处理,但我更喜欢在 ffmpeg 内部进行处理,而不必再次处理缩略图。

这可能会有所帮助:https://dev59.com/xGsy5IYBdhLWcg3w8CfJ - Prof. Falken
2个回答

5

您可以在 scale 滤镜中使用 force_original_aspect_ratio 选项。

注:该选项可强制保持原始画面比例。
ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -q:v 2 -vf "scale=200:100:force_original_aspect_ratio=increase,crop=200:100" image.jpg

当视频的高度或宽度超出所需缩略图的纵横比时,这个方法是否仍然适用?例如,如果视频的宽度比纵横比多100像素,那么它会从左右两侧各删除相等的部分(即每侧50像素)吗? - user779159
如果视频不是正方形,则设置setsar=1将产生错误的结果。缩放本身必须产生一个栅格,当作为方形像素处理时不会失真。 - Gyan
1
如果您正在处理具有非方形像素的视频,例如PAL、NTSC、HDV或变形DVD文件,则LN的答案将无法正常工作。对于像移动相机视频或大多数网络视频这样的方形像素视频,您可以使用它。我的命令将适用于所有来源。 - Gyan
取决于具体的文件。大多数格式中的任何编解码器都可以有非方形像素。 - Gyan
有没有ffprobe的某些输出或其他东西,可以用来查看视频是否具有方形像素? - user779159
显示剩余6条评论

4
如果您的缩略图大小为200x100固定,请执行以下操作:
ffmpeg -ss 100 -i /tmp/video.mp4 -vf "scale='if(gt(dar,200/100),100*dar,200)':'if(gt(dar,200/100),100,200/dar)',setsar=1,crop=200:100"  -frames:v 1 image.jpg

比例尺滤镜检查源和缩放的纵横比,以便一个维度适合200x100画布,另一个维度超出边界,除非它是完美匹配。然后,裁剪滤镜从中心裁剪为200x100,从而处理越界区域。


这可能导致输出尺寸小于所需的尺寸之一,并且会导致裁剪失败(例如,使用115:87的SAR作为输入)。 - llogan
是的,"-1" 没有考虑 SAR。已经修正。 - Gyan

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