Как создать анимацию предварительного просмотра Webp с помощью FFMPEG

Так что я генерировал анимации предварительного просмотра в форматах 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 анимация?

Обновить

даже при максимальном сжатии и минимальном качестве ffmpeg он все равно производит намного больше webp выходы, чем что gif2web дает.

2 ответа

Снизить качество http://ffmpeg.org/ffmpeg-codecs.html

-qscale float
For lossy encoding, this controls image quality, 0 to 100. 
For lossless encoding, this controls the effort and time 
spent at compressing more. The default value is 75. 
Note that for usage via libavcodec, this option is called 
global_quality and must be multiplied by FF_QP2LAMBDA.

Это разумные настройки сжатия для анимированной миниатюры.

      -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
Другие вопросы по тегам