所以我一直在使用生成 GIF 格式的预览动画FFMPEG
。(基本上选择整个视频的几秒钟并存储为gif
)
youtube
然而,生成的格式的预览webp
看起来比我已经实现的要小得多。
下面是我用来生成 3 秒预览的命令,webp
格式如下:
ffmpeg -i d:\1.mp4 -lossless 0 -ss 00:00:00 -t 00:00:03 -s 320x180 1.webp
但这仍然比同等的要大gif
。
关于如何减少输出webp
动画有什么建议吗?
更新
webp
即使使用最大压缩和最小质量 ffmpeg,它仍然会产生比给出的输出大得多的输出gif2web
。
答案1
降低质量 http://ffmpeg.org/ffmpeg-codecs.html#libwebp
-quality float
For lossy encoding, this controls image quality.
For lossless encoding, this controls the effort and time spent in compression.
Range is 0 to 100. Default is 75.
答案2
对于动画缩略图来说,这些是合理的压缩设置。
-compression_level 6 -q:v 75
-loop 0
如果您想让它循环。压缩级别范围是 0 到 6。质量范围是 0 到 100。
https://developers.google.com/speed/webp/docs/cwebp
如果你愿意花更多时间解码,你可以从整个视频中截取短场景来制作更有趣的缩略图。查看我的要旨。
#Creates an animated thumbnail of a video clip
#This script uses scene cuts instead of fixed time intervals, and does not work well for videos with few/infrequent scene cuts
numOfScenes=8 #max number of scenes
sceneLength=1.5 #length of each scene in seconds
sceneDelay=1.7 #time (seconds) after a frame cut to start scene (to avoid transition effects)
for i;do
meta=($(ffprobe -v 0 -select_streams V:0 -show_entries stream=r_frame_rate:format=duration -of default=nw=1:nk=1 "$i"))
framerate=$(bc <<< "scale=3;${meta[0]}/2")
sceneSpacer=$(bc <<< "scale=3;${meta[1]}/(($numOfScenes-1)*2)") #min time between scene selection
ffmpeg -nostdin -ss $sceneSpacer -i "$i" -vsync vfr -vf "select=if(gt(scene\,0.5)*(isnan(prev_selected_t)+gte(t-prev_selected_t\,$sceneSpacer))\,st(1\,t)*0*st(2\,ld(2)+1)\,if(ld(1)*lte(ld(2)\,$numOfScenes)\,between(t\,ld(1)+$sceneDelay\,ld(1)+$sceneDelay+$sceneLength))),scale=320:180:force_original_aspect_ratio=decrease:force_divisible_by=2:flags=bicubic:sws_dither=none,framestep=2,setpts=N/($framerate*TB)" -an -sn -map_chapters -1 -map_metadata -1 -hide_banner -compression_level 5 -q:v 75 -loop 0 -f webp -y "${i%.*}".webp
done