Skip to content

Instantly share code, notes, and snippets.

@witmin
Last active November 5, 2024 20:50
Show Gist options
  • Save witmin/1edf926c2886d5c8d9b264d70baf7379 to your computer and use it in GitHub Desktop.
Save witmin/1edf926c2886d5c8d9b264d70baf7379 to your computer and use it in GitHub Desktop.
Convert MP4 file to animated WebP in ffmpeg

Convert MP4 file to animated WEBP file in ffmpeg CLI

1. Install ffmpeg CLI through homebrew

In terminal.app, install ffmpeg through homebrew

brew install ffmpeg

Validate the installation:

which ffmpeg

Expect to see terminal returns the directory path of ffmpeg such as /usr/local/bin/ffmpeg

2. Set webp properties and convert

Example command which would convert an mp4 file to a lossless loop playing webp file in 20FPS with resolution 800px(width) * h600px(height):

ffmpeg -i input_filename.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 1 -loop 0 -preset default -an -vsync 0 -s 800:600 output_filename.webp

Export an animated lossy WebP with preset mode picture:

ffmpeg -i input.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 0  -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 -s 800:600 output.webp

primary options:

  • set frame per second as 20: -filter:v fps=fps=20
  • set output file lossless: -lossless 1
  • set output webp file loop play: -loop 0. For non-loop, use -loop 1
  • set rendering mode -preset default , can set as picture, photo, text, icon, drawing and none as needed. It would effect output file size. http://ffmpeg.org/ffmpeg-all.html#Options-28
  • set output webp resolution as w800px * h600px -s 800:600

For more option details, please visit the the ffmpeg libwebp documentation

This method should applicable for majority video formats including .mov, .avi, .flv, etc. as input files as well as .gif format as output file.

@Toyirov
Copy link

Toyirov commented Jun 8, 2022

Hmm, good

@o-t-w
Copy link

o-t-w commented Sep 9, 2022

Unknown encoder 'libwebp'

@aidv
Copy link

aidv commented Sep 15, 2022

To convert a series of transparent .png's to a transparent .webp
ffmpeg -r 30 -i %04d.png -vcodec libwebp -loop 0 -q:v 100 -lossless 1 test.webp

@dmitryfry
Copy link

What about converting webp to gif?

@SalimF
Copy link

SalimF commented Feb 23, 2023

^^ Damn that image toke whole my screen view, remove it and put link instead.

Anyway to OP, how can I set sort of key-frame or control frames consistence, e.g. increased fps when the scene have movement and make still image when the scene stops or let it on lower fps?

@witmin
Copy link
Author

witmin commented Feb 24, 2023

Anyway to OP, how can I set sort of key-frame or control frames consistence, e.g. increased fps when the scene have movement and make still image when the scene stops or let it on lower fps?

Unfortunately I didn't have such needed before and didn't get a chance for keyframes. Would this post about keyframe timestamps helps: https://superuser.com/questions/554620/how-to-get-time-stamp-of-closest-keyframe-before-a-given-timestamp-with-ffmpeg?

@lamnhan066
Copy link

Just leave it here for anyone who wants to set auto-size for width or height:

ffmpeg -i input.mp4 -loop 1 -an -vf scale=400:-2,fps=fps=20 output.webp

Just replace the width or height in scale=width:height with -2 and it will automatically calculate the size for you. Source here.

More information: You shouldn't use the -preset parameter because it will override all other parameters like -lossless, -compression_level and -s so the output may not be as expected. Source here.

@DanielZanchi
Copy link

Converting a GIF with transparency gives a strange result. We still see the old frames in the background :(

@aulerius
Copy link

aulerius commented Mar 4, 2024

Even with best settings I get horrible color banding and blockyness. Are there ways to improve this?
image
Comparing to online tools like this one, it seems the codec can indeed achieve way smoother results. It's something to do with ffmpeg then.

@aidv
Copy link

aidv commented Apr 3, 2024

I wrote a tool to stitch PNG’s into a n animated WebP video with transparency and no gradient banding.

@thipperz
Copy link

I wrote a tool to stitch PNG’s into a n animated WebP video with transparency and no gradient banding.

So.. where?

@thipperz
Copy link

^^ Damn that image toke whole my screen view, remove it and put link instead.

Anyway to OP, how can I set sort of key-frame or control frames consistence, e.g. increased fps when the scene have movement and make still image when the scene stops or let it on lower fps?

How did you handle this?

@aidv
Copy link

aidv commented May 14, 2024

I wrote a tool to stitch PNG’s into a n animated WebP video with transparency and no gradient banding.

So.. where?

I'm thinking of making it into an app. Would this be interesting?

@vitaly-zdanevich
Copy link

Now avif is better?

@abiriadev
Copy link

abiriadev commented May 31, 2024

Note of 2024:

-vsync is deprecated. Use -fps_mode
Passing a number to -vsync is deprecated, use a string argument as described in the manual.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment