要从视频中途的图像中获取缩略图,我可以这样做
ffmpeg -ss 100 -i /tmp/video.mp4 -frames:v 1 -s 200x100 image.jpg
。通过使用 -ss 100
,它会在 100
秒处获得缩略图(假设视频长度为 200
秒,这将是视频的一半)。
但是,如果我不知道视频的确切长度,在我的应用程序代码中,我需要使用类似
ffprobe
的东西来首先确定视频的长度,然后将其除以 2 以获得缩略图时间。
有没有办法让 ffmpeg 获得你想要的视频百分比的缩略图?因此,不要指定
-ss 100
,而是使用 -ss 50%
或 -ss 20%
来获取文件中一半或 20% 的缩略图?
我知道我可以通过应用程序代码来做到这一点,但如果有一种方法让 ffmpeg 自己处理这个问题,效率会更高。
它不漂亮,但是:
ffmpeg -y -i logo-13748357.mp4 -vf "select=gte(n\,$(shuf -i 1-$(ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 logo-13748357.mp4) -n 1))" -vframes 1 out_img.png
上面的命令是一个单行的示例,它捕获视频中的帧数并将其传递给“shuf”命令https://linux.die.net/man/1/shuf,该命令随机选择一个帧范围内的数字,并将结果传递给 ffmpeg。
所以上面的代码能够从视频中随机选择一帧,只有一行。
您也许能够根据您的特定目标调整这种方法。当然,假设七年后它仍然很重要。